我有一個Java表格,其中包含目錄中的內容。我創建了5個組合框,將用戶導航到文件夾中,然後使用選定文件夾的內容(如文件名,日期,創建者等)創建一個JTable。在表格的第6列中,我有一些字符串值,並且取決於每個值我想改變這個單元格的背景顏色。 這裏是我啓動JTable的最後一個comboBox。在動態JTable上更改單元格的背景顏色
-1
A
回答
3
對不起,你試圖抓住NPE catch(NullPointerException n){}
- 是非常錯誤的 - 從不這樣做,而是修復可能導致NPE發生的錯誤。
至於你的問題,你沒有超載的實際方法。你的方法簽名:
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex)
不符合實際的方法簽名:
public Component prepareRenderer(TableCellRenderer renderer,
int row,
int column)
按照該JTable API,你錯過了第三個參數,列int參數。
這就是爲什麼你應該總是預置重寫的方法與@Override
註釋。如果你這樣做:
@Override // this will cause the compiler to complain that this isn't an override
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex)
而你在這個方法循環看起來相當可疑。我會擺脫它,因爲渲染器應該僅渲染由行和列索引指定的單元格。
例如,
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;
}
};
3
你不應該延長JTable
但DefaultTableCellRenderer
,並設置爲你的表的默認渲染:
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);
}
}
可能的,這是一個更好的長期解決方案,因爲它也允許OP爲特定列設置單元格渲染器。 - 氣墊船全鱔
更妙的是,你不需要知道列索引提前當你覆蓋getColumnClass()
在TableModel
:
同一渲染器類中的所有列:
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返回不同的ColumnClass,每次運行:
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);
}
}
類型t Ø返回:
interface TagRed {}
interface TagBlue {}
interface TagYellow {}
使用(運行多次...):
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. 動態更改JTable單元格的背景顏色
- 2. 在JTable更改特定的單元格顏色背景
- 3. 無條件地更改JTable單元格的背景顏色
- 4. jTable單元格背景顏色
- 5. 根據單元格中的值動態更改單元格的背景顏色
- 6. 更改JTable中單元格的顏色
- 7. 更改JTable的背景顏色
- 8. jQuery在更改時動態更改顏色/背景顏色
- 9. 更改JTable單元格顏色
- 10. Java JTable更改單元格顏色
- 11. 如何更改java中JTable中單個單元格的背景顏色?
- 12. JTable中如何更改背景顏色
- 13. 更改JTable非內容背景顏色
- 14. 動態更改Gtk.Entry的背景顏色
- 15. 更改單元格上的日期背景顏色
- 16. 更改單元格的背景顏色滑動刪除
- 17. fullcalendar更改日期單元格背景顏色,不僅事件背景顏色
- 18. 動態調整表格單元格的背景顏色在asp.net
- 19. 如何更改JTable中編輯的單元格的背景顏色?
- 20. 更改單元格背景顏色而不更改焦點
- 21. 自動更改單元格背景顏色Excel VBA
- 22. 用JavaScript動態更改背景顏色
- 23. Android:動態更改TextView背景顏色
- 24. 更改背景顏色動態(安卓)
- 25. 動態更改背景顏色
- 26. 更改背景顏色動態
- 27. 動態更改背景顏色
- 28. 更改背景顏色動態
- 29. 如何更改JTable中第一個單元格的背景顏色?
- 30. WPF:在運行時動態更改DataGrid單元格/行背景顏色
快速注:'抓(NullPointerException異常N){}'?你永遠不應該趕上NPE,這表明你有這個代碼嚴重錯誤。 –
如果您需要進一步的幫助,您需要創建併發布有效的[mcve],一個作爲代碼格式文本發佈在您的問題中的新小程序。 –
我現在看到你的[以前沒有回答的問題](https://stackoverflow.com/questions/44279125/add-selected-data-from-jtable-to-lst-file)中請求了一個MCVE,但是你永遠不會提供了一個(就像你不在這裏)。請不要忽視這些要求,如果你想得到一個體面的答案你的問題。我們要求提供這些信息是有原因的 - 這樣我們才能完全理解您的代碼,您的問題和您的問題。 –