Personalizzato TableCellRenderer non funziona (rendering tavolo riga)
-
29-09-2019 - |
Domanda
Sto cercando di rendere un riga specifica del mio JTable (dovrebbe avere un colore di sfondo diverso e dovrebbe avere caratteri in grassetto).
ho trovato diverse domande su come implementare un TableCellRenderer
personalizzato ( qui e qui ) e il tutorial come usare le tabelle e questo ( Table Row Rendering ).
Io sto usando un JInternalFrame
per visualizzare il JTable
. Ho cercato di realizzare entrambe le soluzioni ma né getCellRenderer
né prepareRenderer
sono chiamati. Quando il debug, posso vedere il mio nuovo essere JTable creato, ma, il mio punto di interruzione all'interno dei metodi non sono chiamati.
I miei sguardi codice come:
this.add(createData(model));
private JComponent createData(ProfitLossTableModel model) {
JTable table = new JTable(model) {
public TableCellRenderer getCellRenderer(int row, int column) {
if ((row == 0) && (column == 0)) {
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setHorizontalAlignment(JLabel.RIGHT);
renderer.setBackground(Color.red);
return renderer;
} else {
return super.getCellRenderer(row, column);
}
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.changeSelection(0, 0, false, false);
table.setAutoCreateRowSorter(true);
return new JScrollPane(table);
}
Come si può vedere, il modello è la mia implementazione di un AbstractTableModel
.
Certo che mi manca qualcosa. Ho provato a chiamare repaint()
per vedere se qualcosa è successo, ma venne in mente nulla.
Ho anche provato a mettere un JPane dentro la mia JInternalFrame e aggiungerli alla JScrollPane in esso, ma nulla si è verificato anche.
Qualsiasi aiuto?
TIA,
Bob
Soluzione
Come discusso nel Concetti: Editor e Renderers , "il tavolo richiama il metodo getColumnClass
del modello da tavolo, che ottiene il tipo di dati delle celle della colonna". È necessario verificare che l'implementazione di AbstractTableModel
restituisce un valore adeguato, come suggerito in questo esempio .
Addendum:
Sto cercando di rendere una riga, non una colonna.
Rob Camick è Tabella Row Rendering approccio che le sostituzioni prepareRenderer()
sembra proposito.
tabbedPane.addTab("FirstRow", createFirstRow(model));
...
private JComponent createFirstRow(DefaultTableModel model) {
final Font font = new Font("Serif", Font.BOLD, 14);
JTable table = new JTable(model) {
public Component prepareRenderer(
TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
if (!isRowSelected(row)) {
c.setBackground(row == 0 ? Color.yellow: getBackground());
c.setFont(row == 0 ? font : getFont());
}
return c;
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.changeSelection(1, 1, false, false);
return new JScrollPane(table);
}