Colorare una riga specifica di una jTable

di il
14 risposte

Colorare una riga specifica di una jTable

Ciao a tutti,
qualcuno sa dirmi in modo chiaro come si colora una riga specifica di una jTable? Trovo in rete accrocchi ma niente di pulito. Ho provato banalmente a fare table.setBackground(color) ma ovviamente mi colora tutte le righe.

Grazie a tutti

14 Risposte

  • Re: Colorare una riga specifica di una jTable

    loop4633 ha scritto:


    qualcuno sa dirmi in modo chiaro come si colora una riga specifica di una jTable?
    In realtà dipende da un fattore: se la colorazione dipende dal contenuto delle celle oppure no. Se no, potrebbe dipendere solo dall'indice logico di riga (es. nel caso di una classica colorazione "alternata").
  • Re: Colorare una riga specifica di una jTable

    Dipende dal contenuto di una cella, ossia se trovo una stringa ben precisa deve accendersi la riga
    Grazie
  • Re: Colorare una riga specifica di una jTable

    Nessuna idea?
  • Re: Colorare una riga specifica di una jTable

    loop4633 ha scritto:


    Dipende dal contenuto di una cella, ossia se trovo una stringa ben precisa deve accendersi la riga
    Grazie
    L'argomento è complesso, non è banale. L'aspetto delle celle dipende dai table cell renderer e implementarli "bene" non è facile. Dovresti comunque farti una idea più precisa di cosa succede "dietro le quinte" tra JTable e i renderer.
    E purtroppo non riuscirei a spiegarlo con poche parole in un post ...
  • Re: Colorare una riga specifica di una jTable

    Ciao andbin,
    riusciresti a farmi un esempio in cui se becca la stringa "ciao" su una riga qualsiasi e una colonna prestabilità accende la riga di rosso?
    Non riesco a venirne a capo in una cosa così stupida (apparentemente)
    Grazie anticipatamente se vorrai aiutarmi
  • Re: Colorare una riga specifica di una jTable

    Qualcuno sa dirmi perchè non vedo l'evidenziazione sulla riga?
    
    public class MyTableCellRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                                                       boolean hasFocus, int row, int column){
            
            int v=(Integer)value;
            if (v==33) {
                setForeground(Color.RED);
            } else {
                setForeground(null);
            }
            return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        }
    }
        
    
        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            tester();        // TODO add your handling code here:
        }                                        
    
        private void tester(){
            DefaultTableModel model = new DefaultTableModel();
            Vector rows=new Vector();
            Vector cols=new Vector();
            cols.add("Numero1");
            cols.add("Numero2");
            cols.add("Numero3");
            cols.add("Numero4");
            
            
            int k=0;
            while(k<100)
            {
                Vector v=new Vector();
                v.add(k);
                v.add(k+1);
                v.add(k+2);
                v.add(k+3);
                rows.add(v);
                k+=4;
            }
            model=new DefaultTableModel(rows,cols);
            jTableTest.setModel(model);
    //        jTableTest = new JTable(model);
            jTableTest.setDefaultRenderer(Object.class, new MyTableCellRenderer());
            
            
        }
    
    Grazie anticipatamente a chiunque voglia aiutarmi
  • Re: Colorare una riga specifica di una jTable

    loop4633 ha scritto:


    Qualcuno sa dirmi perchè non vedo l'evidenziazione sulla riga?
    Perché la versione "super" di getTableCellRendererComponent che chiami dopo il tuo set, fa sicuramente la impostazione del background. (giusto per tua cultura, guarda il sorgente di DefaultTableCellRenderer)

    E comunque se vuoi evidenziare una riga in base al valore di 1 cella, l'approccio con i renderer è più critico e complicato proporzionalmente a quanti tipi di renderer sono coinvolti nella tabella.

    In questi casi, meglio estendere JTable, ridefinire prepareRenderer e ragionare anche a livello di model se fornire da esso la informazione che la riga è "evidenziata".
  • Re: Colorare una riga specifica di una jTable

    Grazie per la tua risposta, questa cosa purtroppo mi farà ammattire, ho seguito il tuo consiglio ma ho parecchi problemi... non so se potessi buttargli un occhio te ne sarei grato
    
    
    private void tester(){
            DefaultTableModel model = new DefaultTableModel();
            Vector rows=new Vector();
            Vector cols=new Vector();
            cols.add("Numero1");
            cols.add("Numero2");
            cols.add("Numero3");
            cols.add("Numero4");
            
            
            int k=0;
            while(k<100)
            {
                Vector v=new Vector();
                v.add(k);
                v.add(k+1);
                v.add(k+2);
                v.add(k+3);
                rows.add(v);
                k+=4;
            }
            model=new DefaultTableModel(rows,cols);
            
            jTableTest = new JTable(model) {
            public Component prepareRenderer(TableCellRenderer renderer, int Index_row, int Index_col) {
            // get the current row
            Component comp = super.prepareRenderer(renderer, Index_row, Index_col);
            // even index, not selected
            for(int i=0; i<Index_row; i++){
                for(int j=0; j<Index_col; j++){
                    int v=(Integer)model.getValueAt(i, j);
                    if (v==33) {
                        comp.setBackground(Color.red);
                    } else {
                        comp.setBackground(null);
                    }
                }
            }
            
            return comp;
        }
    };
            
            
            
            
    //        jTableTest.setModel(model);jTableTest
    ////        jTableTest = new JTable(model);
    //        jTableTest.setDefaultRenderer(Object.class, new MyTableCellRenderer());
    //        
        }
    
    
  • Re: Colorare una riga specifica di una jTable

    Ciao,
    ho risolto, posto la soluzione per qualche altro sventurato
    
     public class MyTableCellRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                                                       boolean hasFocus, int row, int column){
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            
            if(row%2==0){
                this.setBackground(Color.lightGray);
            }else{
                this.setBackground(Color.WHITE);
            }
            String str=value.toString();
            if(column==3 && !(str.toUpperCase().equals("Ciao"))){
                this.setBackground(Color.RED);
                //this.setForeground(Color.RED);
            } else {
                //this.setForeground(null);
                this.setBackground(Color.WHITE);
            }
            return this;
        }
    }
    
    Grazie
    Ciao a tutti
  • Re: Colorare una riga specifica di una jTable

    loop4633 ha scritto:


    ho risolto, posto la soluzione
    Sì, più o meno è ok. Dovresti però non impostare il background se la cella è "selezionata", perché il renderer sicuramente setta già un colore appropriato. Altrimenti fai "saltare" il concetto di selezione delle celle!
  • Re: Colorare una riga specifica di una jTable

    Sisi, ho notato
    Grazie
  • Re: Colorare una riga specifica di una jTable

    Ho notato invece una cosa che non capisco...
    Quando muovo la scrollbar orizzontale genera l'eccezione
    
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    
    e non capisco a cosa è legata...
    hai qualche idea?
  • Re: Colorare una riga specifica di una jTable

    loop4633 ha scritto:


    e non capisco a cosa è legata...
    Verifica lo stack-trace.
  • Re: Colorare una riga specifica di una jTable

    Risolto, grazie mille, era un controllo che facevo su una colonna.
Devi accedere o registrarti per scrivere nel forum
14 risposte