2011-08-24 15 views
5

sto cercando di prendere confidenza con JTables, TableModels, JTableHeaders, renderer, ecc Sto cercando di fare un semplice tavolo fittizio (per scopi di pratica) che assomiglia a questo:Modifica dell'oscillazione JTable cellulari Colori

- 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 è riportato di seguito e si basa su innumerevoli esempi che ho trovato su questo sito Web e su Internet in generale. Ma non sto ottenendo i risultati che voglio. Invece sto ottenendo 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 è lì a tutti. Inoltre, con il codice I elencato di seguito, questo esegue e imposta il colore di tutte le celle che colorano, non solo la cella B2 che voglio, tutte le.

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 il rapido-n-dirty MyRenderer classe:

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 è codice orribile e si rompe un sacco di "migliore pratica "modelli e tecniche di tipo (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 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!

+0

Ancora in attesa di un SSCCE ... – camickr

+0

Vedere anche questo relativo [esempio] (http://stackoverflow.com/a/12352838/230513). – trashgod

risposta

14

È necessario assicurarsi di reimpostare il renderer al suo colore di sfondo predefinito (e gestire la selezione fila):

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 inviare una corretta SSCCE con la vostra domanda.

3

Dove si specifica il rendering 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'oggetto valore di JTable è "B2" o se i valori di riga e colonna corrispondono alla cella B2.

E per vedere l'intestazione della tabella, è necessario prima aggiungere la tabella a un JScrollPane e quindi aggiungere JScrollPane al genitore.

La cosa più importante: leggi le esercitazioni di Swing su JTables poiché questo è tutto spiegato in là.

+0

Grazie Hovercraft: si prega di fare riferimento al condizionale aggiunto nella classe Renderer. Tuttavia non funziona ancora - cosa mi manca? – IAmYourFaja

4

Half-risposta:

devi mettere il vostro JTable all'interno di un JScrollPane avere l'intestazione visualizzata. In alternativa è possibile aggiungere manualmente al layout il componente restituito da myTable.getTableHeader(). Raccomando comunque di usare un JScrollPane.

EDIT:

Come suggerito qui di seguito, di trasformare il blu per una sola cella specifica, tutto quello che dovete fare è aggiungere un test come questo:

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

E: cosa succede se in 'myTable.setDefaultRenderer (Object.class, myRenderer);' sostituisci 'Object.class' con' String.class'? – ChrisJ

+0

come può aiutare il suo problema? –

+0

Tutti i dati nella mia tabella saranno stringhe. Devo cambiare la chiamata per usare String.class, e in caso affermativo, ciò interromperà qualcosa? Cosa avrei bisogno di cambiare per aggiustare una tale interruzione? – IAmYourFaja

0

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

0

Credo che il modo corretto di colorare le tabelle sia tramite il numero ColorHighlighter. Ho dato un example here.