我有一个包含三列字符串的表。我希望最后一列有绿色背景和粗体字。所以我想我需要一个自定义的TableCellRenderer。但是当我调用table.setDefaultRenderer
时,它会查找Class columnClass
以及我的自定义渲染器的实例。所以我给了它String.class
的值。但是它没有用于渲染,我在它的getTableCellRendererComponent方法中设置了一个断点并且它没有被击中。
以下是我设置自定义渲染器的代码 -
public class TableTest extends JPanel implements ActionListener {
MyTableCellRenderer renderer = new MyTableCellRenderer();
MyTableModel model = new MyTableModel();
JTable table = new JTable();
public TableTest() {
super(new GridLayout(1,0));
this.setPreferredSize(new Dimension(800, 800));
model.addRow(Arrays.asList("Testing", "Hello world", "Goodbye"));
model.addRow(Arrays.asList("Testing", "Hello world", "Goodbye"));
table = new JTable(model);
table.setDefaultRenderer(String.class, new MyTableCellRenderer());
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
//Add the scroll pane to this panel.
add(scrollPane);
}
}
public class MyTableCellRenderer extends JLabel implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
this.setText(value.toString());
setBackground(Color.GREEN);
setText("Test");
return this;
}
public class MyTableModel extends AbstractTableModel {
private List<String> columnNames = new ArrayList<String>();
private List<List> data = new ArrayList();
{
columnNames.add("Test");
columnNames.add("Test");
columnNames.add("Test");
}
public void addRow(List<String> rowData) {
data.add(rowData);
fireTableRowsInserted(data.size() - 1, data.size() - 1);
}
public int getRowCount() {
return data.size();
}
public int getColumnCount() {
return columnNames.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
return data.get(rowIndex).get(columnIndex);
}
}
我做错了什么,为什么不使用单元格渲染器?
注意:我已编辑帖子以包含其他类。
答案 0 :(得分:3)
检查您的TableModel.getColumnClass(int col)
,也许它会返回Object.class
。然后,您需要使用Object.class
而不是String.class
注册渲染器,即:
table.setDefaultRenderer(Object.class, new MyTableCellRenderer());
答案 1 :(得分:3)
答案 2 :(得分:2)
我希望最后一列有绿色背景和粗体字。
如果您只想在最后一列上进行自定义呈现,而不是调用table.setDefaultRenderer()
,则可以使用此代码(假设表中有固定数量的列):
table.getColumnModel().getColumn(table.getColumnCount()-1).setCellRenderer(new MyTableCellRenderer());
答案 3 :(得分:1)
我看到你有自己的MyTableModel
。您是否在模型中重载了getColumnClass()
?然后,您可以指定第一列包含字符串,然后该表应使用您为字符串设置的渲染器。