Modifica dei colors delle celle di Swing JTable

Sto cercando di mettermi a mio agio con JTables, TableModels, JTableHeaders, renderer, ecc. Sto cercando di creare una semplice tabella fittizia (per scopi pratici) che assomigli a questo:

- 1 2 3 A A1 A2 A3 B B1 B2 B3 C C1 C2 C3 

Voglio anche che la cella B2 – e solo quella cella – abbia uno sfondo blu (Color.BLUE) – tutte le altre celle possono avere il colore predefinito di Swing a cui sono assegnate automaticamente.

Il mio codice è al di sotto e si basa su innumerevoli esempi che ho trovato su questo sito e su Internet in generale. Ma non sto ottenendo i risultati che voglio. Invece sto prendendo un tavolo che assomiglia a questo:

 A A1 A2 A3 B B1 B2 B3 C C1 C2 C3 

Si noti che la prima riga (l’intestazione) non è affatto lì. Inoltre, con il codice che elenco sotto, questo esegue e imposta il colore di tutte le celle che colorano, non solo la cella B2 che voglio.

Il codice :

 public class MyTable { public static void main(String[] args) { String[][] data = getTableData(); String[] cols = getTableCols(); JFrame frame = magicallyCreateJFrame(); // I promise this works! MyRenderer myRenderer = new MyRenderer(); // See below DefaultTableModel defModel = new DefaultTableModel(data, cols); JTable myTable = new JTable(defModel); myTable.setDefaultRenderer(Object.class, myRenderer); frame.add(myTable); frame.pack(); frame.setVisible(true); } } public static String[] getTableCols() { String cols = { "-", "1", "2", "3", }; } public static String[][] getTableData() { String[][] data = { { "A", "A1", "A2", "A3", }, { "B", "B1", "B2", "B3", }, { "C", "C1", "C2", "C3", }, }; return data; } 

E la class MyRenderer quick-n-dirty:

 public class MyRenderer extends DefaultTableCellRenderer { 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); if(row == 2 && column == 2) c.setBackground(new java.awt.Color(0, 0, 255)); return c; } } 

Oltre al fatto che questo è un codice orribile e rompe un sacco di “buone pratiche” – tipi di schemi e tecniche (ricorda che questo è solo qualcosa con cui sto giocando), c’è qualcosa che sto facendo qui che è evidentemente ovvio ? Perché non ottengo l’intestazione di una tabella (prima riga “- 1 2 3”)? Perché il mio renderer di celle predefinito non funziona sulla specifica cella B2 che sto specificando?

JTables sembrano essere animali strani, belli e potenti. Sto lentamente avvolgendo la mia mente intorno a loro, ma sto soffocando sulla realizzazione. Grazie a tutti quelli che possono aiutare!

Devi assicurarti di reimpostare il renderer sul colore di sfondo predefinito (e gestire la selezione delle righe):

 if (! table.isRowSelected(row)) { if(row == 2 && column == 2) c.setBackground(new java.awt.Color(0, 0, 255)); else c.setBackground(table.getBackground()); } 

In futuro pubblica un SSCCE corretto con la tua domanda.

Half-risposta:

Devi inserire il tuo JTable in un JScrollPane per visualizzare l’intestazione. In alternativa, puoi aggiungere manualmente al layout il componente restituito da myTable.getTableHeader() . Raccomando comunque di usare un JScrollPane .

MODIFICARE:

Come suggerito di seguito, per trasformare lo sfondo blu solo per una cella specifica, tutto ciò che devi fare è aggiungere un test come questo:

 if(column == 2 && row == 1) { c.setBackground(Color.BLUE); } else { c.setBackground(Color.WHITE); } 

Dove specifichi il renderer per colorare B2 e solo B2? Forse si desidera posizionare un blocco if nel metodo getTableCellRendererComponent in modo che il colore di sfondo sia impostato su blu solo se toString () dell’object valore di JTable è “B2” o se i valori di riga e colonna corrispondono alla cella B2.

E per vedere l’intestazione della tabella, devi prima aggiungere la tabella a un JScrollPane e quindi aggiungere JScrollPane al genitore.

La cosa più importante: leggi i tutorial di Swing su JTables in quanto è tutto spiegato qui.

Forse, myTable.setDefaultRenderer(String.class, myRenderer); funzionerebbe correttamente

Credo che il modo corretto di colorare la tavola sia tramite un ColorHighlighter . Ho dato un esempio qui .