Java ActionEvents和ItemEvents:在动态JComboBox上处理事件

Java ActionEvents和ItemEvents:在动态JComboBox上处理事件,java,swing,jtable,jcombobox,tablecelleditor,Java,Swing,Jtable,Jcombobox,Tablecelleditor,关于我的代码,我遇到了一些问题,如果对此有任何见解,我将不胜感激 首先,这里是一些上下文(关于以下代码): 主对象可以在左列的组合框编辑器中选择,每个主对象都有自己的数据集,其中包含相同类型的对象,用于以后的比较和操作。右侧列的编辑器(也是组合框)更新以显示此数据集。但是,列表中的第一个元素被认为是向所述列表添加新元素的选项,当选择它时(actionEvent),将创建新的数据对象,但一旦重新选择组合框,它将创建并显示另一个数据对象 这段代码代表了我的应用程序中产生问题的部分的基本结构,我已经尽

关于我的代码,我遇到了一些问题,如果对此有任何见解,我将不胜感激

首先,这里是一些上下文(关于以下代码): 主对象可以在左列的组合框编辑器中选择,每个主对象都有自己的数据集,其中包含相同类型的对象,用于以后的比较和操作。右侧列的编辑器(也是组合框)更新以显示此数据集。但是,列表中的第一个元素被认为是向所述列表添加新元素的选项,当选择它时(actionEvent),将创建新的数据对象,但一旦重新选择组合框,它将创建并显示另一个数据对象

这段代码代表了我的应用程序中产生问题的部分的基本结构,我已经尽可能多地将它(尽可能多地)以SSCCE格式修剪为基本结构。有些对象仍然使用法语名称,如果您不理解它们的用途,我可以更改它们。上一段解释了很多,不过如果你想要精确,我很乐意继续

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.JScrollPane;


public class TestApp extends JFrame {

    private JPanel contentPane;
    private CustomTable table;
    private JComboBox<GeneralPrimaryObject> selecteurObjets = new JComboBox<GeneralPrimaryObject>();

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TestApp frame = new TestApp();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public TestApp() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(42, 46, 350, 103);
        contentPane.add(scrollPane);

        selecteurObjets.addItem(new FirstSubClass());

        table = new CustomTable();
        table.setModel(new DefaultTableModel(
                new Object[][] {
                    {null, ""},
                    {null, null},
                    {null, null},
                    {null, null},
                    {null, null},
                },
                new String[] {
                    "Primary object", "Sublist from object"
                }
            ));
        scrollPane.setViewportView(table);
        table.getColumnModel().getColumn(1).setPreferredWidth(105);
        table.setRowHeight(15);
        TableColumn colonneObjets = table.getColumnModel().getColumn(0);
        colonneObjets.setCellEditor(new DefaultCellEditor(selecteurObjets));
        table.getModel().addTableModelListener(new TableModelListener(){
            private static final int COLONNE_OBJETS = 0;
            private GeneralPrimaryObject previousObject;
            @Override
            public void tableChanged(TableModelEvent e) {
                int row = e.getFirstRow();
                int col = e.getColumn();
                JComboBox<GeneralPrimaryObject> editor = new JComboBox<GeneralPrimaryObject>();
                GeneralPrimaryObject confirmedObject;
                Object value;
                ArrayList<GeneralPrimaryObject> objects;
                //new object standing in for the "New data set..." item
                FirstSubClass newObjectStandIn = new FirstSubClass();

                newObjectStandIn.setName("New data set...");
                previousObject = newObjectStandIn;
                TableModel modele = (TableModel)e.getSource();
                value = modele.getValueAt(row, col);
                if(col == COLONNE_OBJETS && value != null){
                    confirmedObject = (GeneralPrimaryObject)value;
                    objects = confirmedObject.getData();
                    for(GeneralPrimaryObject o : objects){
                        System.out.println("Fuck");
                        editor.addItem(o);
                    }
                    editor.addItem(newObjectStandIn);
                    editor.addItemListener(new ItemListener(){

                        @Override
                        public void itemStateChanged(ItemEvent e) {
                            if(e.getStateChange() == ItemEvent.SELECTED){

                            }
                        }

                    });

                    editor.addActionListener(new ActionListener(){

                        @Override
                        public void actionPerformed(ActionEvent e) {

                            JComboBox<GeneralPrimaryObject> source = (JComboBox<GeneralPrimaryObject>) e.getSource();

                            GeneralPrimaryObject object = null, objetSelectionne = (GeneralPrimaryObject)source.getSelectedItem();
                            String nom = "Data set " + (source.getItemCount());
                            previousObject.equals(objetSelectionne);




                            if(source.getSelectedIndex() == 0){
                                    switch(objetSelectionne.getType()){
                                    case FIRSTSUB:
                                        object = new FirstSubClass();
                                        object.setName(nom);
                                        break;
                                    case SECONDSUB:
                                        object = new SecondSubClass();
                                        object.setName(nom);
                                        break;
                                    default:
                                        break;

                                    }



                            }
                            if(object != null){
                                System.out.println("Flag1");
                                source.addItem(object);
                                source.setSelectedItem(object);

                            }
                        }

                    });
                    table.addEditor(editor, row);
                }

            }

        });
    }
    private class CustomTable extends JTable{
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private ArrayList<TableCellEditor> editors = new ArrayList<TableCellEditor>(8);

        public CustomTable(){
            super();
            editors.ensureCapacity(8);
            for (int i = 0; i < 8; i++) {
                editors.add(null);
            }
        }

        /*@Override
        public TableCellRenderer getCellRenderer(int row, int column){
            if(row == 1 && editeurs.size() > row && editeurs.get(row) != null) {
                return editeurs.get(column).;
            }
            return super.getCellRenderer(row, column);
        }
        */

        @Override
        public TableCellEditor getCellEditor(int row, int column){

                int modelColumn = convertColumnIndexToModel( column );

                if (modelColumn == 1 && row < 8){
                    return editors.get(row);
                }else{
                    return super.getCellEditor(row, column);
                }
        }

        public void addEditor(JComboBox<GeneralPrimaryObject> newEditor, int row){
            editors.set(row, new DefaultCellEditor(newEditor));

            this.repaint();
        }
    }
    private abstract class GeneralPrimaryObject{
        protected String name;
        protected ObjectType type;
        private ArrayList<GeneralPrimaryObject> data = new ArrayList<GeneralPrimaryObject>();

        private GeneralPrimaryObject(){

        }

        public abstract String getName();
        public abstract void setName(String name);
        public abstract ObjectType getType();

        public ArrayList<GeneralPrimaryObject> getData(){
            return data;
        }

        public String toString(){
            return this.name;
        }
    }
    private class FirstSubClass extends GeneralPrimaryObject{
        public FirstSubClass(){
            super();
            setName("SubclassObject");
            this.type = ObjectType.FIRSTSUB;
        }
        @Override
        public String getName() {
            return this.name;
        }
        @Override
         public void setName(String name) {

            this.name = name;
        }
        @Override
        public ObjectType getType() {

            return this.type;
        }

    }
    private class SecondSubClass extends GeneralPrimaryObject{
        public SecondSubClass(){
            super();
            setName("OtherSubclassObject");
            this.type = ObjectType.SECONDSUB;
        }
        @Override
        public String getName() {
            return this.name;
        }
        @Override
         public void setName(String name) {

            this.name = name;
        }
        @Override
        public ObjectType getType() {

            return this.type;
        }

    }
    private enum ObjectType{
        FIRSTSUB, SECONDSUB;
    }
}
导入java.awt.EventQueue;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.ItemEvent;
导入java.awt.event.ItemListener;
导入java.util.ArrayList;
导入javax.swing.DefaultCellEditor;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTable;
导入javax.swing.border.EmptyBorder;
导入javax.swing.event.TableModelEvent;
导入javax.swing.event.TableModelListener;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableCellEditor;
导入javax.swing.table.TableColumn;
导入javax.swing.table.TableModel;
导入javax.swing.JScrollPane;
公共类TestApp扩展了JFrame{
私有JPanel内容窗格;
私人定制表;
专用JComboBox selecteurObjets=newjcombobox();
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
TestApp框架=新TestApp();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
/**
*创建框架。
*/
公开测试{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
立根(100100450300);
contentPane=newjpanel();
setboorder(新的EmptyBorder(5,5,5,5));
setContentPane(contentPane);
contentPane.setLayout(null);
JScrollPane scrollPane=新的JScrollPane();
滚动窗格.立根(42,46,350,103);
添加(滚动窗格);
选择Eurobjets.addItem(新的FirstSubClass());
table=新的CustomTable();
table.setModel(新的DefaultTableModel(
新对象[][]{
{null,“},
{null,null},
{null,null},
{null,null},
{null,null},
},
新字符串[]{
“主对象”,“来自对象的子列表”
}
));
scrollPane.setViewportView(表);
table.getColumnModel().getColumn(1).setPreferredWidth(105);
表1.设置行高(15);
TableColumn colonneObjets=table.getColumnModel().getColumn(0);
setCellEditor(新的DefaultCellEditor(selecteurObjets));
table.getModel().addTableModelListener(新的TableModelListener()){
专用静态最终int COLONNE_OBJETS=0;
私有GeneralPrimary对象previousObject;
@凌驾
公共作废表已更改(TableModelEvent e){
int row=e.getFirstRow();
int col=e.getColumn();
JComboBox编辑器=新建JComboBox();
一般主要对象确认对象;
目标价值;
阵列列表对象;
//代表“新数据集…”项的新对象
FirstSubClass newObjectStandIn=新的FirstSubClass();
setName(“新数据集…”);
previousObject=newObjectStandIn;
TableModele=(TableModel)e.getSource();
value=modele.getValueAt(行、列);
if(col==COLONNE\u对象和值!=null){
confirmedObject=(GeneralPrimaryObject)值;
objects=confirmedObject.getData();
对于(GeneralPrimary对象o:对象){
系统输出打印(“操”);
编者补充(o);
}
编者:addItem(newObjectStandIn);
addItemListener(新的ItemListener(){
@凌驾
公共无效itemStateChanged(ItemEvent e){
如果(如getStateChange()==ItemEvent.SELECTED){
}
}
});
addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
JComboBox source=(JComboBox)e.getSource();
GeneralPrimaryObject object=null,ObjectSelectOne=(GeneralPrimaryObject)source.getSelectedItem();
字符串nom=“数据集”+(source.getItemCount());
previousObject.equals(ObjetSelectOne);
if(source.getSelectedIndex()==0){
开关(objetselection.getType()){
ca