AbstractTableModel
カスタム、、、TableCellEditor
およびを作成する必要がある最初のJTableを作成していますDefaultTableCellRenderer
。以前にこれらを作成する必要がなかったことを考えると、テーブルを希望どおりに動作させるために、かなりの進歩を遂げました。
しかし、私はオーバーライドしているさまざまな方法すべてに圧倒されており、特定のセルのImageIconを変更する方法を見つけようとして車輪を回しています。 セルにはJLabelが含まれている必要があります。これ ImageIcon
には、とテキスト文字列の両方が必要です。私はすでにイニシャルを設定できますがImageIcon
(おそらく間違って行っていますが)、更新されたを設定することはできませんImageIcon
。失敗することはありませんが、変更は行われません。
一般的な意味で、これらのモデル、エディター、およびレンダラーのすべてがすでにインスタンス化されていると仮定して、アイコンを取得してのJLabel
セルに設定するための最良の方法は何ですか?JTable
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