Я создаю свой первый JTable, который требует от меня создания пользовательских AbstractTableModel
, TableCellEditor
и 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