JTable ImageIcon и строка

Я хочу создать JTable, где в ячейках может быть ImageIcon, String или оба. Я уже пробовал такие решения, как table.setvalue() или просто добавлял Icon к Object Array для создания JTable.

for (int n = 0; n < tableHeight; n++) {
  for (int m = 0; m < tableWidth; m++) {
    if ((n + m) == labelArray.size()) {
      break;
    }

    if (labelArray.get(n + m).iconMode) {  //iconMode is True if there is an icon instead of line text
      data[n][m] = null;
    } else {
      String text = new String("<html><p>" + labelArray.get(n + m).lineOne + "<br>" + labelArray.get(n + m).lineTwo + "<p></html>");
      data[n][m] = text;
    }
  }
}

table = new JTable(data, columnNames);

renderer = new DefaultTableCellRenderer();
renderer.setHorizontalTextPosition(JLabel.CENTER);
renderer.setHorizontalAlignment(JLabel.CENTER);

for (int n = 0; n < tableWidth; n++) {
  table.getColumnModel().getColumn(n).setCellRenderer(renderer);
  table.getColumnModel().getColumn(n).setWidth(50);
}

person T.Harms    schedule 28.08.2018    source источник
comment
Я не могу говорить за всех, но знаю, что многим намного проще отвечать на вопросы, если плакат создает и отображает действительный минимальный воспроизводимый пример программы со своим вопросом.   -  person Hovercraft Full Of Eels    schedule 28.08.2018
comment
Вам нужно будет создать (возможно, анонимный) подкласс DefaultTableCellRenderer и переопределить его метод getTableCellRendererComponent. См. Использование пользовательских средств визуализации в руководстве по Java.   -  person VGR    schedule 28.08.2018


Ответы (1)


может быть ImageIcon, String или и то, и другое.

Вам нужно будет создать собственный объект для хранения в TableModel. Этот объект будет содержать два свойства:

  1. текст
  2. значок

Затем вам нужно будет создать настраиваемое средство визуализации (не использовать средство визуализации по умолчанию) для отображения этого объекта.

Пользовательский рендерер может выглядеть примерно так:

class CustomRenderer extends DefaultTableCellRenderer
{
    public CustomRenderer()
    {
        super();
        setHorizontalTextPosition(JLabel.CENTER);
        setHorizontalAlignment(JLabel.CENTER);
    }

    @Override
    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        CustomObject custom = (CustomObject)value;
        setText( custom.getText() );
        setIcon( custom.getIcon() );

        return this;
    }
}
person camickr    schedule 28.08.2018