java - 如何使用绑定(bind)类通过代码将 JComboBox selectedItem 绑定(bind)到 Jtable?

标签 java swing binding jtable jcombobox

我使用以下代码成功地将 JTextField 绑定(bind)到 JTable 中的选定行:

public static final void BindTableToFields(JTable Table, Object[] Fields) {

    for (Object Field : Fields) {

        BeanProperty<JTable, Object> tableBeanProperty;

        String DesignCallID;
        String PropertyName;

        if (Field instanceof JTextField) {
            BeanProperty<JTextField, String> BindingFieldProperty;
            Binding<JTable, Object, JTextField, String> binding;
            JTextField jTextField = (JTextField) Field;
            DesignCallID = jTextField.getText();
            PropertyName = "selectedElement." + GetCorrespondingColumn(Table, DesignCallID);
            jTextField.setText("");
            System.out.println("property name =" + PropertyName.trim());

            tableBeanProperty = BeanProperty.create(PropertyName);
            BindingFieldProperty = BeanProperty.create("text");
            binding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE,
                    Table,
                    tableBeanProperty,
                    jTextField,
                    BindingFieldProperty);
            Converter<Object, String> old = binding.getConverter();

            Converter<Object, String> converter = new Converter<Object, String>() {
                @Override
                public String convertForward(Object value) {
                    try {

                        if (value instanceof HashMap) {
                            HashMap hashMap = (HashMap) value;
                            System.out.println(hashMap);
                            // Object get = hashMap.get(GetCorrespondingColumn(Table, DesignCallID));
                            return (String) hashMap.get(GetCorrespondingColumn(Table, DesignCallID));

                        } else if (value instanceof String) {
                            return (String) value;
                        } else if (value instanceof Integer) {
                            Integer integer = (Integer) value;
                            return integer.toString();
                        } else if (value instanceof Float) {
                            Float float1 = (Float) value;
                            return float1.toString();
                        } else if (value instanceof Double) {
                            Double double1 = (Double) value;
                            return double1.toString();
                        } else if (value instanceof Date) {
                            Date date = (Date) value;
                            return date.toLocalDate().format(DateTimeFormatter.ISO_LOCAL_DATE);
                        }
                        MyLogger.Log_to_local(new Exception("Binding Class Not Handled" + value.getClass().getName()));
                        return "";

                    } catch (Exception e) {
                        e.printStackTrace();
                        MyLogger.Log_to_local(e);

                    }
                    return "impossible";
                }

                @Override
                public Object convertReverse(String value) {
                    try {
                        return value;

                    } catch (Exception e) {

                        e.printStackTrace();

                    }
                    return null;
                }

            };
            binding.setConverter(converter);
            binding.bind();
     } else 
     //
     //
     //    other component as JPasswordField .....

然后是我尝试绑定(bind) JComboBox 的部分,我尝试了这两个版本:

                    if (Field instanceof JComboBox) {
                    //<editor-fold>
                    System.out.println("binding ");
                    JComboBox jComboBox = (JComboBox) Field;

                    BeanProperty<JComboBox, String> BindingFieldProperty;
                    Binding<JTable, Object, JComboBox, String> binding;
                    DesignCallID = jComboBox.getName();
                    PropertyName = "selectedElement." + GetCorrespondingColumn(Table, DesignCallID);
                    System.out.println("property name =" + PropertyName.trim());

                    tableBeanProperty = BeanProperty.create(PropertyName);
                    BindingFieldProperty = BeanProperty.create("selectedItem");
                    binding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE,
                            Table,
                            tableBeanProperty,
                            jComboBox,
                            BindingFieldProperty);
                    Converter<Object, String> old = binding.getConverter();

                    Converter<Object, String> converter = new Converter<Object, String>() {
                        @Override
                        public String convertForward(Object value) {
                            try {

                                if (value instanceof HashMap) {
                                    HashMap hashMap = (HashMap) value;
                                    System.out.println(hashMap);
                                    // Object get = hashMap.get(GetCorrespondingColumn(Table, DesignCallID));
                                    return (String) hashMap.get(GetCorrespondingColumn(Table, DesignCallID));

                                } else if (value instanceof String) {
                                    return (String) value;
                                } else if (value instanceof Integer) {
                                    Integer integer = (Integer) value;
                                    return integer.toString();
                                } else if (value instanceof Float) {
                                    Float float1 = (Float) value;
                                    return float1.toString();
                                } else if (value instanceof Double) {
                                    Double double1 = (Double) value;
                                    return double1.toString();
                                } else if (value instanceof Date) {
                                    Date date = (Date) value;
                                    return date.toLocalDate().format(DateTimeFormatter.ISO_LOCAL_DATE);
                                }
                                MyLogger.Log_to_local(new Exception("Binding Class Not Handled" + value.getClass().getName()));
                                return "";

                            } catch (Exception e) {
                                e.printStackTrace();
                                MyLogger.Log_to_local(e);

                            }
                            return "impossible";
                        }

                        @Override
                        public Object convertReverse(String value) {
                            try {
                                return value;

                            } catch (Exception e) {

                                e.printStackTrace();

                            }
                            return null;
                        }

                    };
                    binding.setConverter(converter);
                    binding.bind();
                       //</editor-fold>
                }

另一个版本是:

                    System.out.println("binding jcombobox");
                    JComboBox jComboBox = (JComboBox) Field;

                    BeanProperty<JComboBox, Integer> BindingFieldProperty;
                    Binding<JTable, Object, JComboBox, Integer> binding;
                    DesignCallID = jComboBox.getName();
                    PropertyName = "selectedElement." + GetCorrespondingColumn(Table, DesignCallID);
                    System.out.println("property name =" + PropertyName.trim());

                    tableBeanProperty = BeanProperty.create(PropertyName);
                    BindingFieldProperty = BeanProperty.create("selectedItem");
                    binding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE,
                            Table,
                            tableBeanProperty,
                            jComboBox,
                            BindingFieldProperty);
                    Converter<Object, Integer> old = binding.getConverter();

                    Converter<Object, Integer> converter = new Converter<Object, Integer>() {
                        @Override
                        public Integer convertForward(Object value) {
                            try {

                                if (value instanceof HashMap) {
                                    HashMap hashMap = (HashMap) value;
                                    System.out.println(hashMap);
                                    // Object get = hashMap.get(GetCorrespondingColumn(Table, DesignCallID));
                                    return Integer.parseInt(""+hashMap.get(GetCorrespondingColumn(Table, DesignCallID)));

                                } else if (value instanceof String) {
                                    return Integer.parseInt(""+value);
                                } else if (value instanceof Integer) {
                                    Integer integer = (Integer) value;
                                    return integer;
                                } else if (value instanceof Float) {
                                    Float float1 = (Float) value;
                                    return  float1.intValue();
                                } else if (value instanceof Double) {
                                    Double double1 = (Double) value;
                                    return double1.intValue();
                                } else if (value instanceof Date) {
                                    Date date = (Date) value;
                                    MyLogger.Log_to_local(new Exception("Binding Class Not Handled" + value.getClass().getName()));
                                    return 1;
                                }
                                MyLogger.Log_to_local(new Exception("Binding Class Not Handled" + value.getClass().getName()));
                                return 1;

                            } catch (Exception e) {
                                e.printStackTrace();
                                MyLogger.Log_to_local(e);

                            }
                            return 1;
                        }

                        @Override
                        public Object convertReverse(Integer value) {
                            try {
                                return value;

                            } catch (Exception e) {

                                e.printStackTrace();

                            }
                            return null;
                        }

                    };
                    binding.setConverter(converter);
                    binding.bind();

我不知道我错过了什么,它对 JcomboBox 不起作用! 所以请告诉我是否有任何错误或遗漏的逻辑以及是否有通过代码将我的 JComboBox 绑定(bind)到我的 JTable 的解决方案告诉我如何。 谢谢

最佳答案

首先,IMO,您提供的代码超过 100 行,因此大多数人都不愿意回答这个问题。
回到你的问题,你的问题的可能答案是使用 setCellEditor 方法。如下面的代码

//provided you have instatiate the table.
//then instantiate the `TableColumn` object to accept the column
TableColumn sportColumn = table.getColumnModel().getColumn(2);
...
//add the desired items to be selected by the user
JComboBox comboBox = new JComboBox();
comboBox.addItem("Snowboarding");
comboBox.addItem("Rowing");
comboBox.addItem("Chasing toddlers");
comboBox.addItem("Speed reading");
comboBox.addItem("Teaching high school");
comboBox.addItem("None");
//add the combo box into the column
sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

这里是引用:https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#combobox

关于java - 如何使用绑定(bind)类通过代码将 JComboBox selectedItem 绑定(bind)到 Jtable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40474768/

相关文章:

java - 指示对象状态的空字符串

java - 如何将文件保存在内存中并读取文件输出流?

java - 我的 JFrame 中的另一个重画问题

java - 3 JFrame中的Jpanel,我的按钮不可见

java - JTextField 未读取用户的输入

java - 如何实现通用方法

WPF - 从绑定(bind)路径获取属性值

c# - 类的名称属性,用于查看示例数据

python - coverage.py 是否正确显示 python 绑定(bind)的测试覆盖率?

java - 为什么我的 JList 没有为我提供 java 中 jlist.getSelectedValue() 的值?