2015-02-01 3 views
2

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

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

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

+0

Пожалуйста, см редактировать ответить. –

ответ

4

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

 Смежные вопросы

  • Нет связанных вопросов^_^