【发布时间】:2012-10-05 23:32:49
【问题描述】:
我在使用 jTable 和 DefaultTableModel 时遇到问题。
我有两列使用覆盖的DefaultTableCellRenderer 显示图标:
private static ImageIcon errorIcon = new ImageIcon("workDir/icons/error.png");
private static ImageIcon pageIcon = new ImageIcon("workDir/icons/page_white.png");
private static ImageIcon serverIcon = new ImageIcon("workDir/icons/server_go.png");
private static ImageIcon acceptIcon = new ImageIcon("workDir/icons/accept.png");
private class ImageRenderer extends DefaultTableCellRenderer {
JLabel lbl = new JLabel();
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
//lbl.setText((String) value);
lbl.setVerticalAlignment(SwingConstants.CENTER);
lbl.setHorizontalAlignment(SwingConstants.CENTER);
if (value.equals("e")) {
lbl.setIcon(pageIcon);
return lbl;
}
ServiceTicket t = TICKET_DICT.get((UUID) tableModel.getValueAt(row, 3));
if (t == null) {
throw new IllegalStateException("Cannot find Ticket for UUID");
}
if (t.getReport().getElsterCode().equals("0")) {
if (t.getSendMode().equals(EricSendMode.VALIDATE_LOCALLY)) {
lbl.setIcon(acceptIcon);
} else {
lbl.setIcon(serverIcon);
}
} else {
lbl.setIcon(errorIcon);
}
lbl.repaint();
return lbl;
}
}
我在视图的初始化阶段设置了ImageRenderer:
resultTable.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer());
resultTable.getColumnModel().getColumn(4).setCellRenderer(new ImageRenderer());
我希望我的表是可排序的。所以我使用这一行来启用默认排序:
resultTable.setAutoCreateRowSorter(true);
我现在的问题是排序工作正常,但第 0 列和第 4 列中的图标在排序事件后没有重绘。
我尝试添加一个事件来告诉表格单元格值已更改,但这不起作用:
resultTable.getRowSorter().addRowSorterListener(
new RowSorterListener() {
@Override
public void sorterChanged(RowSorterEvent e) {
if (e.getType().equals(RowSorterEvent.Type.SORTED)) {
for (int i = 0; i < tableModel.getRowCount(); i++) {
tableModel.fireTableCellUpdated(i, 0);
tableModel.fireTableCellUpdated(i, 4);
}
}
}
});
你能帮我在表格排序后重新绘制图标吗?我检查了表格模型,所有单元格和列都正确排序。甚至单元格中的值也会呈现为图标。
谢谢!
【问题讨论】:
-
永远不会甚至考虑代表模型触发事件:行为良好的实现必须在适当的时候触发它们。更糟糕的是:在 sorterListener 中这样做很可能会产生无限循环......
-
是的,你是对的,谢谢!我在另一种方法中产生了 StackOverFlowExceptions!
标签: java swing sorting jtable imageicon