Вопрос

Я хочу поместить отдельные JComboBoxes в каждую ячейку JTable.т. е.Содержимое JComboBox не одинаково для каждой ячейки.

В принципе, я хотел бы иметь возможность просто вызвать следующий код, чтобы добавить строку JComboBox в JTable.У кого-нибудь есть какие-нибудь идеи?Спасибо

JComboBox cb1 = new JComboBox(...);
JComboBox cb2 = new JComboBox(...);
model.addRow(new Object[] {"Row name", cb1, cb2} );

JComboBox cb3 = new JComboBox(...);
JComboBox cb4 = new JComboBox(...);
model.addRow(new Object[] {"Row name 2", cb3, cb4} );

Самый близкий пример кода, который я могу найти, выглядит следующим образом.Но это для случаев, когда содержимое JComboBox идентично для отдельного столбца.Не то решение, которое мне нужно.

TableColumn col = table.getColumnModel().getColumn(vColIndex);
col.setCellEditor(new MyComboBoxEditor(values));

где

public class MyComboBoxEditor extends DefaultCellEditor {
    public MyComboBoxEditor(String[] items) {
        super(new JComboBox(items));
    }
}
Это было полезно?

Решение

Самый простой способ - это реализовать свой собственный Табличная модель

public class MyModel extends AbstractTableModel {
    List rows;

    public int getRowCount() {
        return rows.size();
    }

    public int getColumnCount() {
         return 4;
    }

    public Object getValueAt(int row, int column) {
        return rows.get(row).getCol(col);  //assuming your row "Object" has a getCol()
    }

    public Class<?> getColumnClass(int col) {
        return Boolean.class;
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        rows.get(rowIndex).getCol(columnIndex).setValue(aValue);
    }

}

Загрузите это в свой JTable.Если вы не заменили средство визуализации ячеек по умолчанию на Boolean , все ваши ячейки будут отображаться в виде флажков благодаря вашей реализации getColumnClass().Весь пользовательский ввод в эти флажки собирается с помощью нашего setValueAt().

Другие советы

Расширьте JTable с помощью этого кода:

@Override
public TableCellEditor getCellEditor(int row, int column) {
   Object value = super.getValueAt(row, column);
   if(value != null) {
      if(value instanceof JComboBox) {
           return new DefaultCellEditor((JComboBox)value);
      }
            return getDefaultEditor(value.getClass());
   }
   return super.getCellEditor(row, column);
}

Это создаст уникальный редактор ячеек JComboBox для каждого поля со списком, для которого вы получаете значение a.

Я уверен, что это решит вашу проблему.Укажите, в каком столбце вам нужно установить поле со списком в .getColumn(столбец int)

private void addComboToTable(JComboBox combo) {
    TableColumn gradeColumn = YourTable.getColumnModel().getColumn(0);
    JComboBox comboBox = combo;
    comboBox.removeAllItems();
    try {
        comboBox.addItem("Item 1");
        comboBox.addItem("Item 2");
        comboBox.addItem("Item 3");
    } catch (NullPointerException e) {
    } catch (Exception e) {
        e.printStackTrace();
    }
    gradeColumn.setCellEditor(new DefaultCellEditor(comboBox));
}

Вам нужно переопределить:

Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)

...в TableCellEditor.Значение, переданное этому методу, - это то, что вы можете поместить в свой JComboBox.Это означает, что "значение" для этой конкретной ячейки должно быть чем-то, что может быть преобразовано в коллекцию.Потенциально это может быть просто Список объектов или POJO с полями, которые можно превратить в JComboBox.

Поэтому просто отредактируйте MyComboBoxEditor, чтобы переопределить этот метод, и измените свою модель, чтобы разрешить объект, который фактически представляет несколько других объектов.

Содержимое JComboBox отображается идентично для каждой выбранной строки, потому что JTable не предоставляет возможности иметь более одного редактора для каждого столбца.Вам необходимо расширить класс JTable, чтобы поддерживать дополнительный выбор для строк.

Эта статья объясняет это очень хорошо:http://www.javaworld.com/javaworld/javatips/jw-javatip102.html

В дополнение к CellEditor необходимо сделать CellRenderer, чтобы нарисовать поле со списком в ячейке, посмотрите на это:

 public void example(){  

      TableColumn tmpColum =table.getColumnModel().getColumn(1);
      String[] DATA = { "Data 1", "Data 2", "Data 3", "Data 4" };
      JComboBox comboBox = new JComboBox(DATA);

      DefaultCellEditor defaultCellEditor=new DefaultCellEditor(comboBox);
      tmpColum.setCellEditor(defaultCellEditor);
      tmpColum.setCellRenderer(new CheckBoxCellRenderer(comboBox));
      table.repaint();
   }


/**
   Custom class for adding elements in the JComboBox.
*/
class CheckBoxCellRenderer implements TableCellRenderer {
        JComboBox combo;
        public CheckBoxCellRenderer(JComboBox comboBox) {
            this.combo = new JComboBox();
            for (int i=0; i<comboBox.getItemCount(); i++){
                combo.addItem(comboBox.getItemAt(i));
            }
        }
        public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            combo.setSelectedItem(value);
            return combo;
        }
    }
@Override
public TableCellEditor getCellEditor(int row, int column) {
   Object value = super.getValueAt(row, column);
   if(value != null) {
      if(value instanceof JComboBox) {
           return new DefaultCellEditor((JComboBox)value);
      }
            return getDefaultEditor(value.getClass());
   }
   return super.getCellEditor(row, column);
}

И затем переопределите toString способ из JComboBox.

Эта страница может помочь вам, хотя кажется, что вы ограничены наличием одного и того же поля со списком во всех ячейках столбца.

Вам необходимо создать подкласс JTable, чтобы переопределить метод TableCellEditor getCellEditor(строка int, столбец int).

Это позволяет вам устанавливать произвольные редакторы ячеек для любой комбинации строк и столбцов.Способ по умолчанию - установить редактор ячеек для всего столбца.

(Вы также можете настроить отдельные средства визуализации ячеек, переопределив getCellRenderer .)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top