Связанные редакторы ячеек ComboBox JTable

У меня есть таблица с двумя столбцами comboBox. Поле со списком в первом столбце всегда имеет одинаковые значения. Это довольно просто:

jTableEditTransaction.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(accountClassComboBox));

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


person Mark Ainsworth    schedule 01.02.2015    source источник
comment
Пожалуйста, смотрите редактирование, чтобы ответить.   -  person Hovercraft Full Of Eels    schedule 01.02.2015


Ответы (1)


Вам не нужен отдельный объект редактора для ячеек, вместо этого вам действительно нужен один единственный редактор для столбца. Что нужно изменить, так это данные, хранящиеся в ячейке и отображаемые редактором. Эти данные могут быть привязаны к ячейке и закодированы в вашем редакторе. Вы, вероятно, захотите расширить класс DefaultCellEditor, чтобы позволить вам делать это.

Например, что-то вроде этого возможно:

import java.awt.Component;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class LinkedCombBoxEditors extends JPanel {
   public static final String[] DAY_TYPE = {"Weekday", "Weekend"};
   private static final String[] COL_NAMES = {"Day Type", "Day"};
   private Map<String, DefaultComboBoxModel<String>> keyMap = new HashMap<>();
   private JComboBox<String> innerEditor = new JComboBox<>();

   public LinkedCombBoxEditors() {
      DefaultComboBoxModel<String> cModel = new DefaultComboBoxModel<>();
      cModel.addElement("Monday");
      cModel.addElement("Tuesday");
      cModel.addElement("Wednesday");
      cModel.addElement("Thursday");
      cModel.addElement("Friday");
      keyMap.put(DAY_TYPE[0], cModel);

      cModel = new DefaultComboBoxModel<>();
      cModel.addElement("Saturday");
      cModel.addElement("Sunday");
      keyMap.put(DAY_TYPE[1], cModel);

      DefaultTableModel model = new DefaultTableModel(COL_NAMES, 4);
      JComboBox<String> comboBox0 = new JComboBox<>(DAY_TYPE);
      JTable table = new JTable(model);
      table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(comboBox0));
      table.getColumnModel().getColumn(1).setCellEditor(new ComboEditor1(innerEditor));

      add(new JScrollPane(table));
   }

   private class ComboEditor1 extends DefaultCellEditor {

      private ComboBoxModel<String> emptyModel = new DefaultComboBoxModel<>();

      public ComboEditor1(JComboBox<String> innerEditor) {
         super(innerEditor);
      }

      @Override
      public Component getTableCellEditorComponent(JTable table, Object value,
            boolean isSelected, int row, int column) {
         Component editorComp = super.getTableCellEditorComponent(table, value, isSelected, row, column);
         JComboBox<String> comboBox = (JComboBox<String>)editorComp; 
         Object item = table.getValueAt(row, 0);
         if (item != null) {
            DefaultComboBoxModel<String> comboModel = keyMap.get(item);
            comboBox.setModel(comboModel);
         } else {
            comboBox.setModel(emptyModel);
         }
         // DefaultComboBoxModel<String> model = new 
         return editorComp;
      }
   }

   private static void createAndShowGui() {
      LinkedCombBoxEditors mainPanel = new LinkedCombBoxEditors();

      JFrame frame = new JFrame("LinkedCombBoxEditors");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
person Hovercraft Full Of Eels    schedule 01.02.2015