【发布时间】:2011-01-19 20:12:58
【问题描述】:
我正在创建我的第一个 JTable,它需要我创建自定义 AbstractTableModel、TableCellEditor 和 DefaultTableCellRenderer。鉴于我以前不需要创建这些,我在让我的表按预期运行方面取得了一些重大进展。
但是,我对我要覆盖的所有不同方法感到不知所措,并且正在转动我的轮子试图弄清楚如何修改特定单元格的 ImageIcon。 单元格必须包含一个 JLabel,因为它需要一个 ImageIcon 以及一个文本字符串。我已经可以设置初始的ImageIcon(尽管我可能做错了),但我无法设置更新的ImageIcon。没有失败,但没有进行任何更改。
一般而言,假设所有这些模型、编辑器和渲染器都已实例化,那么获取图标并将其设置为 JTable 的 JLabel 单元格的最佳方法是什么?
如果您想知道的话,我的模型已经定义为为这些单元格返回 JLabel.class,并且一旦据称进行了更改,我也会执行 fireTableCellUpdated(row, col)。如果我在更新前后都做了System.out.println(getIcon()),我什至可以看到源已经改变了。
这里是一些代码(更新了 URL/ImageIcon 修复):
class MonitorTable extends JTable {
MonitorTableModel model = new MonitorTableModel(rows, columnNames);
setModel(model);
...
public void setIconAt(ImageIcon icon, int row, int col) {
model.setIconAt(icon, row, col);
} // End setIconAt(ImageIcon, int, int)
...
class MonitorTableModel extends AbstractTableModel {
...
public void setIconAt(ImageIcon icon, int row, int col) {
StatusTableCellRenderer cell =
(StatusTableCellRenderer)getColumnModel().getColumn(col).getCellRenderer().
getTableCellRendererComponent(myTableObject, null, false, false, row, col);
System.out.println(cell.getIcon()); // Shows initial icon source
cell.setIcon(icon);
fireTableCellUpdated(row, col); // Should update the table
System.out.println(cell.getIcon()); // Shows new icon source
System.out.println("Cell updated");
} // End setIconAt(ImageIcon, int, int)
} // End class MonitorTableModel
public class StatusTableCellRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int col) {
setIcon(imgGray);
setText((String)value);
return this;
} // End getTableCellRendererComponent(JTable, Object, boolean, boolean, int, int)
} // End class StatusTableCellRenderer
} // End class MonitorTable
【问题讨论】:
标签: java swing icons jtable abstracttablemodel