での使用に問題がjTable
ありDefaultTableModel
ます。
上書きされたアイコンを表示する2つの列があります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);
}
}
}
});
テーブルが並べ替えられた後にアイコンを再描画するのを手伝ってもらえますか。テーブルモデルを確認したところ、すべてのセルと列が正しく並べ替えられました。アイコンとしてレンダリングされるセルの値ですら。
ありがとう!