Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    JTable evidenziare righe

    Ciao a tutti,

    sto realizzando un ftp Client usando due JTable una lato Host e l'altra per il compiuter client,
    avrei la necessità al passaggio del mouse all'interno delle jTable di evidenziare le righe visto che i dati sono parecchi.
    Questa discussione è già stata affrontata in qualche post precedente ma vorrei innanzitutto capire quale evento si deve implementare un mouseProcessMotionEvent, od un mouseMoved.
    Le tabelle, per comodità di disegno, sono state inserite nel mio frame usando netBeans.
    Il codice postato nella discussione precedente è perfettamente funzionante così com'è ma non riesco ad adattarlo alla mia applicazione.
    Se inserisco un metodo mouseProcessMotionEvent come lo implemento dalla mia jTable:

    di seguito quello che è stato postato precedentemente e perfettamente funzionante:

    import javax.swing.*;
    import javax.swing.table.*;
    import java.awt.*;
    import java.awt.event.*;

    /**
    *
    * @author Andrea
    */
    public class ColorRows extends JFrame {

    private class MyJTable extends JTable {

    private final Color rowhlcolor;

    private int highLightedRow = -1;
    private Rectangle dirtyRegion = null;

    protected void processMouseMotionEvent(MouseEvent e) {
    int row = rowAtPoint(e.getPoint());
    boolean highlighted = false;

    Graphics g = getGraphics();

    // row changed
    if(highLightedRow != row) {
    if(null != dirtyRegion) {
    paintImmediately( dirtyRegion );
    }
    for(int j = 0; j<getRowCount(); j++) {
    if(row == j) {
    //highlight
    Rectangle firstRowRect = getCellRect(row, 0, false);
    Rectangle lastRowRect = getCellRect(row, getColumnCount() - 1, false);
    dirtyRegion = firstRowRect.union(lastRowRect);
    g.setColor(new Color(rowhlcolor.getRed(), rowhlcolor.getGreen(), rowhlcolor.getBlue(), 30));
    g.fillRect( (int)dirtyRegion.getX(), (int)dirtyRegion.getY(),
    (int)dirtyRegion.getWidth(), (int)dirtyRegion.getHeight() );
    highLightedRow = row;
    }
    }
    }
    }

    public MyJTable(Object[][] data, Object[] columnNames, Color rowhlcolor ) {
    super(data, columnNames);
    this.rowhlcolor = rowhlcolor;
    }

    }

    public ColorRows() {
    super("Another test");
    Object[][] data = {
    {"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)},
    {"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)},
    {"Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false)},
    {"Sharon", "Zakhour", "Speed reading", new Integer(20), new Boolean(true)},
    {"Philip", "Milne", "Pool", new Integer(10), new Boolean(false)}
    };
    String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"};
    MyJTable myTable = new MyJTable(data, columnNames, Color.red);
    this.getContentPane().add(new JScrollPane(myTable), BorderLayout.CENTER);
    this.setSize(400,400);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );

    }

    public static void main (String[] args) {
    new ColorRows();
    }

    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: JTable evidenziare righe

    Originariamente inviato da francesc076
    di seguito quello che è stato postato precedentemente e perfettamente funzionante:
    È sì funzionante (come risultato/effetto finale) ma ad esempio vedo subito che quel ciclo for non serve affatto a nulla.

    Originariamente inviato da francesc076
    Se inserisco un metodo mouseProcessMotionEvent come lo implemento dalla mia jTable
    processMouseMotionEvent non è un metodo di un listener ... è un metodo interno ai componenti (come tutti gli altri processXXX) che serve a processare l'evento.

    Quindi se vuoi usarlo devi estendere JTable e fare l'override di questo metodo ... proprio come mostra l'esempio. Io comunque, personalmente, non avrei fatto l'evidenziazione in quel modo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    aggiungendo le tabelle con il design di netBeans ottengo questo:

    private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();
    jScrollPane2 = new javax.swing.JScrollPane();
    jTable2 = new javax.swing.JTable();

    jTable1.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] {
    {null, null, null, null},
    {null, null, null, null},
    {null, null, null, null},
    {null, null, null, null}
    },
    new String [] {
    "Title 1", "Title 2", "Title 3", "Title 4"
    }
    ));
    jScrollPane1.setViewportView(jTable1);

    setDefaultCloseOperation(javax.swing.WindowConstan ts.EXIT_ON_CLOSE);

    jTable2.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] {
    {dir1, dir2, dir3, dir4},
    {dir5, dir6, ecc, ecc},
    {null, null, null, null},
    {null, null, null, null}
    },
    new String [] {
    "Title 1", "Title 2", "Title 3", "Title 4"
    }
    ));
    jScrollPane2.setViewportView(jTable2);


    ora se volessi estendere dalla classe JTable da una qualunque classe interna come posso accedere ai componenti jTable1 e jTable2 cosi' come sono costruiti.
    volevo provare cosi:
    dentro il construttore:


    DefaultTableModel dtm = (DefaultTableModel)jTable2.getModel();
    //iniz le righe
    Object[][] data= new Object[dtm.getColumnCount()][dtm.getRowCount()];
    //assegno il contenuto
    for(int i = 0; i < dtm.getColumnCount(); i++){
    for(int j =0 ; j < dtm.getRowCount(); j++){
    data[i][j]= dtm.getValueAt(j, j) ;
    }
    }
    stessa cosa per le colonne:
    Object[] columnNames = new ............
    MyJTable myTable = new MyJTable(data, columnNames, Color.red);

    per poi passarli a:

    public MyJTable(Object[][] data, Object[] columnNames, Color rowhlcolor ) {
    super(data, columnNames);
    this.rowhlcolor = rowhlcolor;
    }
    public class ColorRows extends JFrame {

    private class MyJTable extends JTable {

    private final Color rowhlcolor;

    private int highLightedRow = -1;
    private Rectangle dirtyRegion = null;

    protected void processMouseMotionEvent(MouseEvent e) {
    int row = rowAtPoint(e.getPoint());
    boolean highlighted = false;

    Graphics g = getGraphics();

    // row changed
    if(highLightedRow != row) {
    if(null != dirtyRegion) {
    paintImmediately( dirtyRegion );
    }

    //highlight
    Rectangle firstRowRect = getCellRect(row, 0, false);
    Rectangle lastRowRect = getCellRect(row, getColumnCount() - 1, false);
    dirtyRegion = firstRowRect.union(lastRowRect);
    g.setColor(new Color(rowhlcolor.getRed(), rowhlcolor.getGreen(), rowhlcolor.getBlue(), 30));
    g.fillRect( (int)dirtyRegion.getX(), (int)dirtyRegion.getY(),
    (int)dirtyRegion.getWidth(), (int)dirtyRegion.getHeight() );
    highLightedRow = row;


    }
    }


    grazie in anticipo

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da francesc076
    jTable1 = new javax.swing.JTable();
    jTable2 = new javax.swing.JTable();


    ora se volessi estendere dalla classe JTable da una qualunque classe interna come posso accedere ai componenti jTable1 e jTable2 cosi' come sono costruiti.
    Non ci siamo, se l'IDE ti ha generato quel codice .... usa JTable mentre tu avresti bisogno che lì in quelle due righe ci fosse:

    jTable1 = new TuaTabella(...); // con o senza argomenti, dipende.
    jTable2 = new TuaTabella(...);

    Non ha senso che tu dica di creare una estensione di JTable per usare le JTable create dal IDE.

    E questo purtroppo è il solito problema nell'avere codice generato da un IDE.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    ok.. quindi se non volessi rinunciare al progetto grafico cosi com'e' dovrei usare un altro sistema.

    Per esempio ho visto che JTable implementa un metodo mouseMotion come lo potrei usare
    per ottenere lo stesso risultato.... di processMouseMot.....

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da francesc076
    ho visto che JTable implementa un metodo mouseMotion
    Scusa ma di quale metodo parli?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    mouseMoved

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da francesc076
    mouseMoved
    Non esiste un mouseMoved in JTable ..... esiste un mouseMoved nel listener MouseMotionListener che va quindi registrato su un componente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    OK si ho visto nella doc java

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.