java - 在 Swing 中更改 JTable 列中的下拉内容

标签 java swing jtable jcombobox tablecelleditor

我有一个 JTable,其中第一列包含每个单元格中具有相同项目的组合框。如果我在单元格组合框中选择一个项目,我需要从该列中的所有其他组合框中删除所选项目,并添加上一个所选项目到所有其他组合框。我应该怎么做?请帮我举个例子。

public class Save extends JFrame {
  String[] items1 = new String[] { "Cash", "Bank1", "Bank2" ,"Bank3"};
  TableCellEditor editors;
  DefaultTableModel dtmFunds;
  private JComboBox comboBox1;
  private JTable jtblFunds;

  private void loadTable(){
   comboBox1=new JComboBox(items1);
     comboBox1.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {

                    int x=comboBox1.getSelectedIndex();
                    comboItem= e.getItem().toString();
                }
            }
        }); 
     editors=new DefaultCellEditor(comboBox1);

    dtmFunds = new DefaultTableModel(new Object[][] {{"", " ","delete"}}, new Object[] {"Fund Store", "Amount","Action"});  
    jtblFunds=new JTable(dtmFunds){
        public TableCellEditor getCellEditor(int row,int column){

            int modelColumn=convertColumnIndexToModel(column);
            if(modelColumn==0 && row<jtblFunds.getRowCount()-1)
                return editors;
            else
                return super.getCellEditor(row,column);
        }
    };
    jtblFunds.setModel(dtmFunds);
    jtblFunds.getModel().addTableModelListener(new TableModelListener() {
        @Override
        public void tableChanged(TableModelEvent e) {                   
            int row=e.getFirstRow();
            int column=e.getColumn();
            if((column==0)&&(row<jtblFunds.getRowCount()-1)){
               System.out.println("Dropdown changed  "+row);
           }

        }
    });

  }
  }

这些是我用来将组合框添加到名为“Fund Store”的 JTable 列的代码。

最佳答案

真的,将您的精力集中在 CellEditor 本身,这就是它的工作。无需从 JTable 扩展或随意使用它。

import java.awt.Component;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;

public class TestCellEditor {

    public static void main(String[] args) {
        new TestCellEditor();
    }

    public TestCellEditor() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                List<String> values = new ArrayList<>(5);
                values.add("Bananas");
                values.add("Apples");
                values.add("Oranages");
                values.add("Grapes");
                values.add("Pears");

                ComboBoxTableCellEditor editor = new ComboBoxTableCellEditor(values);
                DefaultTableModel model = new  DefaultTableModel(new Object[]{"Fruit"}, 5);
                JTable table = new JTable(model);
                table.getColumnModel().getColumn(0).setCellEditor(editor);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ComboBoxTableCellEditor extends AbstractCellEditor implements TableCellEditor {

        private JComboBox editor;
        private List<String> masterValues;

        public ComboBoxTableCellEditor(List<String> masterValues) {
            this.editor = new JComboBox();
            this.masterValues = masterValues;
        }

        @Override
        public Object getCellEditorValue() {
            return editor.getSelectedItem();
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {

            DefaultComboBoxModel model = new DefaultComboBoxModel(masterValues.toArray(new String[masterValues.size()]));
            for (int index = 0; index < table.getRowCount(); index++) {
                if (index != row) {
                    String cellValue = (String) table.getValueAt(index, 0);
                    model.removeElement(cellValue);
                }
            }

            editor.setModel(model);
            editor.setSelectedItem(value);

            return editor;

        }
    }

}

我更愿意有两个值池,一个是主列表,一个是选定值,每次调用编辑器时准备编辑器会更容易和更快,但这是基本思想...

关于java - 在 Swing 中更改 JTable 列中的下拉内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27009657/

相关文章:

java - ManyToMany N+1 问题 - 所有右侧均未返回

java - 在 Java 中,如何从当前正在运行的 actionPerformed 线程重新绘制面板?

Java Swing - JTable 未显示在滚动 Pane 中

java - 从 ejml 到具有稀疏矩阵的库的转换

java - 这是一个 monad(在 Java 中)吗?

java - 如何与 joptionpane 并行执行 java 函数

java - 如何在 netbeans 的 jtable 中显示查询结果

Java jtable 不可编辑

java - “plusDays”在Java 8中不推进LocalDate

java - GridLayout 删除 JPanel 之间的填充