TableCellRenderer sur mesure ne fonctionne pas (tableau de rendu de ligne)
-
29-09-2019 - |
Question
Je suis en train de rendre une ligne spécifique de mon jtable (il devrait avoir une couleur de fond différente et il devrait avoir des caractères gras).
J'ai trouvé plusieurs questions sur la façon de mettre en œuvre un TableCellRenderer
personnalisé ( ici et ici ) et le tutoriel Comment utiliser les tables et celui-ci ( ligne du tableau de rendu ).
J'utilise un JInternalFrame
pour afficher la JTable
. J'ai essayé de mettre en œuvre les deux solutions mais ni getCellRenderer
ni prepareRenderer
sont appelés. Lors du débogage, je peux voir mon nouvel être jtable créé, mais mon point d'arrêt à l'intérieur des méthodes ne sont pas appelés.
Mon apparence de code comme:
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);
}
Comme vous pouvez le voir, le modèle est ma mise en œuvre d'un AbstractTableModel
.
Bien sûr que je manque quelque chose. J'ai essayé d'appeler repaint()
pour voir si quelque chose est arrivé, mais rien ne se passait.
J'ai aussi essayé de mettre un JPane dans mon JInternalFrame et ajoutez-le dans JScrollPane, mais rien ne se passait aussi.
Toute aide?
TIA,
Bob
La solution
Comme indiqué dans Concepts: Les éditeurs et les équarrisseurs , « la table invoque la méthode getColumnClass
du modèle de table, qui obtient le type de données des cellules de la colonne. » Vous devez vérifier que votre implémentation de AbstractTableModel
retourne une valeur appropriée, comme l'a suggéré dans cette exemple .
Addendum:
Je suis en train de rendre une ligne, pas une colonne.
Rob Camick est Tableau ligne Rendu approche qui outrepasse prepareRenderer()
semble à propos.
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);
}