Visualizzazione dei risultati da 1 a 10 su 11

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    28
    Io ho risolto con una soluzione semplice, che ho utilizzato tante volte... In pratica puoi utilizzare una matrice "parallela" di booleani in cui riporti quale cella colorare... Forse uno snippet è più comprensibile di tante parole:

    codice:
    Object rowData[][] = new Object[nrRow][nrCol];
     
    boolean redColoring[][] = new boolean[nrRow][nrCol];
      
    String columnNames[] = new String[nrCol];
    
    JTable table = new JTable(rowData, columnNames);
        
        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 (redColoring[row][column]) {
            
              label.setBackground(Color.RED);
            
            }
                   
            return label;
                   
            }
        
        });
    A questo punto ti gestisci il vettore di booleani, alzando o abbassando l'elemento che vuoi colorare. In soldoni, quando si scatena l'evento che aspetti fai un semplice

    codice:
    redColoring[h][k] = true;
    e vedi che la cella (h,k) si colora immediatamente di rosso.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da javatore Visualizza il messaggio
    codice:
        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 (redColoring[row][column]) {
            
              label.setBackground(Color.RED);
            
            }
                   
            return label;
                   
            }
        
        });
    Le principali questioni su questo codice sono:
    - innanzitutto restituisci un nuovo JLabel ad ogni aggiornamento della cella. I renderer "buoni" normalmente giocano molto al "risparmio" e restituiscono sempre la stessa identica istanza del componente. E anzi la classe del renderer generalmente è il componente stesso!
    - non tratti per niente i flag isSelected/hasFocus.

    Se andassi a sbirciare nel sorgente di DefaultTableCellRenderer scopriresti che già solo questo renderer di "default" fa molte, molte più cose e inoltre sovrascrive "vuoti" una serie di metodi per ragioni di performance.
    Ultima modifica di andbin; 22-05-2014 a 12:39
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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 © 2026 vBulletin Solutions, Inc. All rights reserved.