Ich habe eine Tabelle in Java, die den Inhalt von Verzeichnissen enthält. Ich habe 5 ComboBoxes erstellt, die den Benutzer in Ordnern navigieren und dann eine JTable mit dem Inhalt des ausgewählten Ordners, wie Dateiname, Datum, Ersteller usw. erstellen. In der 6. Spalte der Tabelle habe ich einige String-Werte und abhängig von jedem Wert Ich möchte die Hintergrundfarbe dieser Zelle ändern. Hier ist die letzte ComboBox, in der ich die JTable starte.Ändern Sie die Hintergrundfarbe der Zelle auf dynamische JTable
Antwort
Sorry, um ehrlich zu sein, aber Ihr Versuch, NPE catch(NullPointerException n){}
zu fangen - ist so sehr falsch - nie dies tun, sondern beheben Sie stattdessen die Fehler, die die NPE verursachen könnte.
Wie für Ihr Problem, überlasten Sie nicht die tatsächliche Methode. Ihre Methode Unterschrift:
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex)
entspricht nicht der tatsächlichen Methode Signatur:
public Component prepareRenderer(TableCellRenderer renderer,
int row,
int column)
gemäß dem JTable API, Ihnen fehlt die 3. Parameter, die Spalte int Parameter.
Deshalb sollten Sie immer überschreiben Methoden mit der @Override
Annotation voranstellen. Hätten Sie das getan:
@Override // this will cause the compiler to complain that this isn't an override
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex)
Und Ihre for-Schleife in dieser Methode sieht ziemlich suspekt. Ich würde es loswerden, da der Renderer nur die Zelle rendern sollte, die durch die Zeilen- und Spaltenindizes angegeben ist.
zB
DefaultTableModel listModel = new DefaultTableModel();
JTable table1 = new JTable(listModel){
@Override // don't forget this!
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int columnIndex) {
JComponent component = (JComponent) super.prepareRenderer(renderer, i, columnIndex);
int lastRow = listModel.getRowCount();
// this will likely set the whole row. If you only want to set only a specific cell, then
// you'll need to first check the columnIndex.
if (getValueAt(rowIndex, 6).toString().contains("yellow")) {
component.setBackground(Color.RED);
} else {
component.setBackground(null); // turn color back to default
}
return component;
}
};
Sie sollten nicht verlängern JTable
aber DefaultTableCellRenderer
und festgelegt, dass als Standard-Renderer in Ihrer Tabelle:
public class TableRendererExample {
public static void main(String[] args) {
TableCellRenderer renderer = new DefaultTableCellRenderer(){
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
Component rendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
rendererComponent.setBackground("value2".equals(value)?Color.RED:Color.WHITE);
return rendererComponent;
}
};
TableModel tableModel= new DefaultTableModel(10, 3){
@Override
public Object getValueAt(int arg0, int arg1) {
return "value"+new Random().nextInt(4);
}
};
JTable jTable = new JTable(tableModel);
jTable.setDefaultRenderer(Object.class, renderer);
JOptionPane.showMessageDialog(null, jTable);
}
}
wahrscheinlich dies ist ein bessere langfristige Lösung, da es auch das OP erlaubt um den CellRenderer für eine bestimmte Spalte festzulegen. - Hovercraft Full Of Eels
Noch besser Sie brauchen nicht auf den Spaltenindex im Voraus zu wissen, wann Sie überschreiben getColumnClass()
in TableModel
:
gleiche Renderer Klasse für alle Spalten:
class DefaultTableCellRendererBackground extends DefaultTableCellRenderer {
private final Color highlightColor;
DefaultTableCellRendererBackground(Color highlightColor) {
this.highlightColor = highlightColor;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
Component rendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row,
column);
rendererComponent.setBackground(highlightColor);
return rendererComponent;
}
}
TableModel gibt für jede Ausführung verschiedene ColumnClasses zurück:
final class DefaultTableModelExtension extends DefaultTableModel {
private final List<Class<?>> columnClass;
DefaultTableModelExtension(int rowCount, int columnCount, List<Class<?>> columnClass) {
super(rowCount, columnCount);
this.columnClass = columnClass;
Collections.shuffle(this.columnClass);
}
@Override
public Class<?> getColumnClass(int col) {
return columnClass.get(col);
}
@Override
public Object getValueAt(int arg0, int arg1) {
return "value" + new Random().nextInt(4);
}
}
Typen t o zurückgegeben werden:
interface TagRed {}
interface TagBlue {}
interface TagYellow {}
Nutzung (Laufmehrfach ...):
public class TableRendererExample {
public static void main(String[] args) {
JTable jTable = new JTable();
jTable.setDefaultRenderer(TagRed.class, new DefaultTableCellRendererBackground(Color.RED));
jTable.setDefaultRenderer(TagBlue.class, new DefaultTableCellRendererBackground(Color.BLUE));
jTable.setDefaultRenderer(TagYellow.class, new DefaultTableCellRendererBackground(Color.YELLOW));
List<Class<?>> columnClass = Arrays.asList(TagRed.class, String.class, TagBlue.class, TagRed.class, String.class,
TagYellow.class, TagBlue.class);
jTable.setModel(new DefaultTableModelExtension(10, columnClass.size(), columnClass));
JOptionPane.showMessageDialog(null, jTable);
}
}
- 1. Ändern der Hintergrundfarbe einer Zelle in einer JTable
- 2. Ändern der Tabelle Zelle Hintergrundfarbe
- 3. Ändern Sie die Hintergrundfarbe einer Zeile in einer JTable
- 4. WPF ändern Zelle Hintergrundfarbe basierend auf Inhalt
- 5. JTable Zelle Schriftfarbe basierend auf Zelle
- 6. Dynamische Hintergrundfarbe für Gesamtzelle
- 7. Hintergrundfarbe ändern, wenn die Zelle den Namen der Farben enthält
- 8. So ändern Sie die Hintergrundfarbe der Navigationsregisterkarten
- 9. die Hintergrundfarbe ändern
- 10. Dynamische Referenz auf die obige Zelle
- 11. Ändern der JTable-Zellenfarbe
- 12. So ändern Sie jede Hintergrundfarbe der uitableviewcell
- 13. Ändern Sie die Größe der Sammlungsansicht Zelle
- 14. Access JTable Zelle Komponente
- 15. Apache POI, ändern Hintergrundfarbe tut in der falschen Zelle
- 16. Zelle Bearbeitung in JTable
- 17. JTable Zelle Null zurück
- 18. JTable Zelle Editor Dezimilierungsschwelle
- 19. Jqgrid Set Zelle Hintergrundfarbe
- 20. Dynamische Änderung der Spaltenüberschrift Text in JTable
- 21. Zurück Hintergrundfarbe der ausgewählten Zelle
- 22. Ändern Sie die Farbe der Linie zwischen Tab und JTable
- 23. Wie JTable Zelle Rendering nach Zelle bearbeitet
- 24. Get Vordergrund Zelle jtable
- 25. Ändern der Textfarbe basierend auf der Hintergrundfarbe
- 26. JUnit Test JTable Zelle Tooltips
- 27. Ändern Sie die Hintergrundfarbe von ActionBarSherlock programmgesteuert
- 28. Wie bekomme ich die dynamische Zelle Zelle Wert auf Knopfdruck
- 29. JTable ändern die Zeilenhöhe dynamisch
- 30. Symbol in JTable-Zelle, die Fehlausgabe verursacht
Schnellhinweis: 'catch (Nullpointer n) {}'?Sie sollten nie eine NPE fangen, und dies deutet darauf hin, dass Sie mit diesem Code etwas ernsthaft falsch machen. –
Wenn Sie weitere Hilfe benötigen, sollten Sie ein gültiges [mcve], ein neues kleines Programm, das in Ihrer Frage als Code-formatierter Text geschrieben wurde, erstellen und veröffentlichen. –
Ich sehe jetzt, dass ein MCVE in Ihrer [vorherige unbeantwortete Frage] angefordert wurde (https://stackoverflow.com/questions/44279125/add-selected-data-from-jtable-to-lst-file), aber dass Sie nie eine (wie Sie nicht hier). Bitte ignorieren Sie diese Anfragen nicht, wenn Sie eine anständige Antwort auf Ihre Fragen wünschen. Wir bitten diese Informationen aus einem bestimmten Grund - damit wir Ihren Code, Ihr Problem und Ihre Frage vollständig verstehen können. –