Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    28

    [JAVA] Colorare singola cella di una JTable

    Salve a tutti,
    in un mio progetto mi sono praticamente impantanato su questo problema: non riesco a colorare in maniera dinamica una o più determinate celle della mia JTable.

    Ho una JTable di stringhe e ho implementato il renderer in questa maniera:

    codice:
    public class CustomTableCellRenderer extends DefaultTableCellRenderer {
       
      @Override
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
     
        //Component c = super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
        JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        
        setOpaque(true);
        
        label.setHorizontalAlignment(SwingConstants.CENTER);
        
        if (...) {
        
          label.setBackground(Color.RED);
          
        }  
        
        return label;
         
      }
      
    }
    Nella classe in cui disegno la tabella ho instanziato il renderer per ogni colonna così:

    codice:
    table.getColumnModel().getColumn(0).setCellRenderer(new CustomTableCellRenderer()); 
    
    table.getColumnModel().getColumn(1).setCellRenderer(new CustomTableCellRenderer());
    Il mio problema è che a priori non riesco a stabilire quale cella occorre colorare, non sono riuscito a trovare la condizione che fa al caso mio in quel benedetto if colorato di rosso... Mi servirebbe una funzione del tipo coloraCella(riga,colonna,colore), che chiamo all'occorrenza e che mi vada a colorare la cella corrispondente... Come faccio ad ottenere una cosa del genere??

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    C'è una sezione apposita dedicata a Java.
    Sposto la discussione.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    28
    Grazie... Chiedo scusa per non aver postato nella sezione giusta...

  4. #4
    Ciao, in base a cosa devi colorare la cella? tipo ti arriva un numero negativo (per esempio) e la devi colorare di rosso???

  5. #5
    Anch'io ho questo problema.
    stavo pensando ad una soluzione del genere.

    Preventivamente creare una Vector di interi dove calcolare e salvare la riga (o le righe) che devono essere colorate.
    passare la Vector al costruttore della CustomTableCellRenderer e poi confrontare la riga nella getTableCellRendererComponent con la riga che hai salvato nel Vector (se hai più righe nel Vector cicli con un for).

    Per adesso non mi viene altro.
    Ancora non ho provato questa soluzione, poi la applicherò al mio progetto.

    Fammi sapere, Ciao
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  6. #6
    Scusate però secondo me sarebbe utile per chi magari vi vuole aiutare sapere in base a cosa, in base a quale condizione voi dovete colorare queste celle.
    Se magari esprimete questo vedrete che sicuramente sarete aiutati.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    28
    Eccomi, scusate il ritardo... Innanzitutto vi ringrazio per avermi risposto ed aver dedicato del tempo al mio problema... E' vero, ho omesso il particolare (importante) del criterio di colorazione, ma se l'ho fatto è perché segue una logica un po' contorta, legata al programma che sto sviluppando... Quindi non volevo complicare la mia richiesta e soffermarmi solo sull'aspetto della programmazione... Comunque, chiacchiere a parte, il contenuto della singola cella da solo non basta per decretare il suo colore (caso del numero negativo), ma devo effettuare delle ulteriori elaborazioni tra la cella e le sue adiacenti. Giusto per dare un esempio, ho una tabella di una riga e tre colonne (per semplificare, tanto il concetto è lo stesso), in queste tre celle mi arrivano dei numeri e devo colorare la cella che contiene il numero maggiore. A priori non so né quali numeri mi arrivano, né in quale cella vi sia il maggiore... Devo fare tutto ciò dinamicamente e quando ciò avviene chiamare la getTableCellRendererComponent(), ma la cosa non è possibile... L'approccio del Vector è giusto, ma se non conosco a priori i miei numeri, non posso implementare nessun confronto...

  8. #8
    Se a priori SAI quante celle ha la tua tabella puoi far così:
    codice:
    //Ti istanzi le variabili righeCelle e colonneCelle
    
    public CustomTableCellRenderer(int righeCelle, int colonneCelle){
      this.righeCelle=righeCelle;
      this.colonneCelle=colonneCelle;
    }
    
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      boolean ismax;
      .....
      ismax=searchMax(row, column, table);
      ......
      if(ismax)....
      ...
    }
    
    private boolean searchMax(int riga, int colonna, JTable tabella){
      int value=tabella.getvalue(riga, colonna);
      for (int r=0; r<righeCelle; r++){
         for (int c=0; c<colonneCelle; c++){
            if(value<Integer.parseInt(tabella.getValue(r,c))
              break;
              return false;
         }
      }
      return true;
    prova così...non sono proprio sicurissimo forse il break potresti anche toglierlo.
    e così ti ritorna il boolean per il tuo if...
    prova così e fammi sapere.
    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    28
    Grazie mille schumy2000, sei stato gentilissimo!! L'idea è sicuramente buona e penso che ormai ci siamo... Lo adatto al mio codice (il massimo tra i numeri era solo di esempio, il mio caso è diverso) e ti faccio sapere...

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    28
    Ok, funziona!! Ho risolto creando una matrice di booleani che ha le stesse dimensioni della tabella:

    codice:
    JTable table; 
    Object rowData[][];
    boolean greenColoring[][];
    
    rowData = new Object[10][10];
    greenColoring = new boolean[10][10];
    
    for (int i = 0; i < 10; i++) 
      for (int j = 0; j < 10; j++) 
        greenColoring[i][j] = false;
    
    table = new JTable(rowData, columnNames) {  
      
      @Override
      public boolean isCellEditable(int row,int column){  
        return false;  
      }  
    };
        
    table.setDefaultRenderer(Object.class, new TableCellRenderer() {
        
      @Override
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
            
         JLabel label = new JLabel(value.toString());
            
         label.setOpaque(true);
            
         if (greenColoring[row][column]) 
           label.setBackground(Color.GREEN);
            
         return label;
                   
       }
    });
    Per ogni elemento (i,j) della tabella aggiorno anche il relativo booleano, nel caso debba essere colorato o meno. Grazie ancora e buona giornata.

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.