在Swing的JTable列中更改下拉菜单内容 [英] Changing Dropdown content in a JTable Column in Swing

查看:84
本文介绍了在Swing的JTable列中更改下拉菜单内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a JTable in which the first column contains combobox with same items in each cell.If i select an item in a cell combobox i need to remove the selected item from all the other combobox in that column and also add the previous selected item to all the other combobox.How should i do that?Please help me with an example.

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列的代码.

These are are codes i have used to add combobox to JTable column named "Fund Store".

推荐答案

真正地,将精力集中在CellEditor本身上,这就是工作.无需从JTable伸出或拧紧它.

Really, focus your efforts within the CellEditor itself, that's it's job. There is no need to extend from JTable or screw around with it.

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;

        }
    }

}

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

I'd prefer to have to two pools of values, one which is the master list and one which is the selected values, it would be easier and faster to prepare the editor each time it's invoked, but this is the basic idea...

这篇关于在Swing的JTable列中更改下拉菜单内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆