Sto provando a fare in modo che la mia tabella selezioni un'intera riga quando si fa clic su una cella (operazione che può essere eseguita disattivando la selezione della colonna), ma, I non voglio il bordo più spesso intorno alla cella specifica su cui hai fatto clic per essere evidenziato. Speravo che questo sarebbe stato facile, ma a quanto pare si tratta di renderer così ho fatto un sacco di ricerche e la più vicina che può ottenere è questo:Java - Swing - JTable - Imposta il colore per la riga selezionata, ma non la cella
JTable contactTable = new JTable(tableModel);
contactTable.setCellSelectionEnabled(true);
contactTable.setColumnSelectionAllowed(false);
contactTable.setRowSelectionAllowed(false);
contactTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// This renderer extends a component. It is used each time a
// cell must be displayed.
class MyTableCellRenderer extends JLabel implements TableCellRenderer {
// This method is called each time a cell in a column
// using this renderer needs to be rendered.
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
// 'value' is value contained in the cell located at
// (rowIndex, vColIndex)
if (isSelected) {
// cell (and perhaps other cells) are selected
}
if (hasFocus) {
// this cell is the anchor and the table has the focus
this.setBackground(Color.blue);
this.setForeground(Color.green);
} else {
this.setForeground(Color.black);
}
// Configure the component with the specified value
setText(value.toString());
// Set tool tip if desired
// setToolTipText((String)value);
// Since the renderer is a component, return itself
return this;
}
// The following methods override the defaults for performance reasons
public void validate() {}
public void revalidate() {}
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
}
int vColIndex = 0;
TableColumn col = contactTable.getColumnModel().getColumn(vColIndex);
col.setCellRenderer(new MyTableCellRenderer());
Ho copiato il renderer da un esempio e ha cambiato solo la funzione hasFocus() usare i colori che volevo. L'impostazione dei colori in isSelected()
non ha fatto nulla.
Il problema con questo codice è:
funziona solo su una colonna specificata dal vColIndex in basso. Ovviamente lo voglio applicato a tutte le colonne, quindi facendo clic su una cella in una evidenzia l'intera riga. Potrei fare un ciclo for per cambiarlo in ogni cella ma immagino ci sia un modo migliore per farlo che cambia il cellRenderer per TUTTE le colonne contemporaneamente.
funziona per modificare il testo ma
setBackgroundColor()
non fa nulla sullo sfondo delle celle. Mi piacerebbe che cambiasse effettivamente il colore di sfondo come implica la proprietà.- Soluzione per n. 2: utilizzare
this.setOpaque(true);
prima di assegnare backgroundcolor.
- Soluzione per n. 2: utilizzare
Quando il renderer funziona, funziona solo su una singola cella. Come posso colorare tutte le celle nella fila?
- Soluzione per # 3: l'ho capito! Invece di utilizzare
hasFocus()
, che influisce solo sulla singola cella, se si abilita la selezione di riga (table.setRowSelectionAllowed(true)
), si modifica il colore nell'istruzioneif(isSelected)
. Quindi l'intera riga viene considerata selezionata e colora tutte le celle!
- Soluzione per # 3: l'ho capito! Invece di utilizzare
3 è stato uno dei grandi, ma se qualcuno conosce # 1 oppure può spiegare a me perché è stato progettato in modo tale che si può applicare solo il renderer di una colonna in un momento che sarebbe molto apprezzato.
Grazie per la risposta. Ho provato a usare setSelectionBackground (Color) ma Eclipse lo contrassegna come un metodo inesistente. – Daniel
In realtà ho capito quella parte, ho modificato il post originale. – Daniel
Ho provato il metodo setSelectionBackGround ora e funziona. Quando seleziono una o più righe, i loro colori sono cambiati. Ma forse capisco male quello che stai cercando. – mbaydar