2016-01-11 13 views
5

Sto cercando una soluzione per questo problema: Ho un file excel, che contiene dati. Alcune celle hanno uno sfondo giallo. Ho già creato un codice per importare il testo in JTable, che funziona bene. Ma voglio anche importare il colore della cella di sfondo in celle specifiche. Per semplicità di questo esempio, non ho usato i loop, leggendo i dati excel dalla sorgente ecc. Dopo aver letto il forum ho capito che ho bisogno di CustomCellRenderer.Colore solo celle specifiche in JTable

Ho un problema con questo approccio, perché questo codice colora correttamente le celle nella colonna, ma quando inizio a scorrere le celle colorate in questa tabella, ricolora l'intera colonna in giallo. (guarda lo screenshot)

Ho pensato di aggiungere un'altra istruzione per colorare in modo specifico le celle rimanenti in bianco, ma questo approccio non funzionerà per me, perché sovrascriverei i miei precedenti risultati di cella.

Potete indicarmi una soluzione su questo? (si tratta di un bug o comportamento atteso di JTable?). Sto utilizzando NetBeans e il generatore di n drop GUI di trascinamento

enter image description here

import java.awt.Color; 
import java.awt.Component; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 

public class MyRenderer 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); 

     int[][] coordinatesYellow = new int[3][2]; 
     //[row][column] these cells are yellow 
     coordinatesYellow[0][0] = 3; 
     coordinatesYellow[0][1] = 2; 
     coordinatesYellow[1][0] = 4; 
     coordinatesYellow[1][1] = 2; 
     coordinatesYellow[2][0] = 2; 
     coordinatesYellow[2][1] = 2; 

     for (int i = 0; i < 3; i++) { 
      if ((row == coordinatesYellow[i][0]) && (column == coordinatesYellow[i][1])) { 
       c.setBackground(Color.yellow); 
      } 
     } 
     return c; 
    } 
} 



// And this is the statement I use for calling the renderer: 
// resultsTable.getColumnModel().getColumn(0).setCellRenderer(new MyRenderer()); 
+0

@TT - il commento è essenzialmente una risposta completa. – tucuxi

+0

@tucuxi Vero, sembrava così banale che ho postato come commento. Ho fatto una risposta. –

+0

Vedere anche http://stackoverflow.com/questions/22606227/colored-table-cells (potrebbe anche essere un duplicato ...) – Marco13

risposta

2

fare in modo che quando il vostro cellulare non deve essere di colore giallo, che si imposta lo sfondo bianco (o colore di sfondo della tabella) .

Un renderer che si estende DefaultTableCellRenderer utilizza lo stesso componente (a JLabel) come modello per tutte le cellule (cf DefaultTableCellRenderer note di implementazione - lo chiamano passacarte). Una volta impostato lo sfondo su giallo, rimarrà giallo per il rendering di celle consecutive finché non cambierai nuovamente il colore di sfondo.

Sostituisci il tuo ciclo for con qualcosa di simile a quanto segue:

boolean isYellow = false; 
for (int i = 0; i < 3; i++) { 
      if ((row == coordinatesYellow[i][0]) && (column == coordinatesYellow[i][1])) { 
       c.setBackground(Color.yellow); 
       isYellow = true; 
      } 
     } 
if(!isYellow) 
    c.setBackground(Color.white); 
+0

Questo non funziona come previsto. Se aggiungo un'altra istruzione nel ciclo for, il risultato è solo la cella sampletext è in giallo, perché il ciclo for sovrascrive i risultati. – radox1912

+1

@ radox1912 In ** tutti ** i casi in cui non si imposta il colore su giallo ... Ciò significa che se non si è impostato nulla per il colore giallo, è necessario impostarlo su bianco. –

+0

@ radox1912 Ho aggiunto un segmento di codice che riflette la mia affermazione. –