Помещение JComboBox в JTable - PullRequest
       30

Помещение JComboBox в JTable

14 голосов
/ 19 января 2009

Я хочу поместить отдельные JComboBox в каждую ячейку 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));
    }
}

Ответы [ 9 ]

9 голосов
/ 04 июня 2009

Расширить 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 для каждого поля со списком, для которого вы получаете значение.

3 голосов
/ 22 ноября 2011

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

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));
}
2 голосов
/ 24 мая 2013

В дополнение к 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;
        }
    }
2 голосов
/ 25 ноября 2011

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

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

2 голосов
/ 19 января 2009

Вам необходимо переопределить:

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

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

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

1 голос
/ 20 апреля 2010
@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.

0 голосов
/ 20 марта 2009

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

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

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

0 голосов
/ 19 января 2009

Самый простой способ - реализовать собственную TableModel

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. Если вы не заменили средство визуализации ячеек по умолчанию для логических, все ваши ячейки будут отображаться как флажки благодаря реализации getColumnClass (). Весь пользовательский ввод в эти флажки собирается с помощью нашего setValueAt ().

0 голосов
/ 19 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...