无法在JavaFX组合框中强制转换对象

无法在JavaFX组合框中强制转换对象,java,javafx,javafx-2,javafx-8,Java,Javafx,Javafx 2,Javafx 8,我有一个组合框,用户可以按ID和名称显示数据: public class Listobject extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { // Insert Some data final C

我有一个组合框,用户可以按ID和名称显示数据:

public class Listobject extends Application
{


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

    @Override
    public void start(Stage stage)
    {

        // Insert Some data

        final ComboBox<ListGroupsObj> listGroups = new ComboBox();


        listGroups.setButtonCell(new GroupListCell());
        listGroups.setCellFactory(new Callback<ListView<ListGroupsObj>, ListCell<ListGroupsObj>>()
        {
            @Override
            public ListCell<ListGroupsObj> call(ListView<ListGroupsObj> p)
            {
                return new GroupListCell();
            }
        });

        listGroups.setEditable(true);

        ListGroupsObj ob = ListGroupsObj.newInstance().groupId(12).groupName("Group12");
        listGroups.getItems().addAll(ob);
        ListGroupsObj osb = ListGroupsObj.newInstance().groupId(13).groupName("Group13");
        listGroups.getItems().addAll(osb);
        ListGroupsObj oa = ListGroupsObj.newInstance().groupId(14).groupName("Group14");
        listGroups.getItems().addAll(oa);
        ListGroupsObj oz = ListGroupsObj.newInstance().groupId(15).groupName("Group15");
         listGroups.getItems().addAll(oz);


        // second way to add object
        listGroups.getItems().add(new ListGroupsObj(12, "Group 12"));

        listGroups.setValue(ob);

        // Display the selected Group
        listGroups.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<ListGroupsObj>()
        {

            @Override
            public void changed(ObservableValue<? extends ListGroupsObj> arg0, ListGroupsObj arg1, ListGroupsObj arg2)
            {
                if (arg2 != null)
                {
                    System.out.println("Selected Group: " + arg2.getGroupId() + " - " + arg2.getGroupName());
                }
            }
        });

        final StackPane layout = new StackPane();
        layout.getChildren().add(listGroups);
        layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 15;");
        stage.setScene(new Scene(layout));
        stage.show();
    }

    class GroupListCell extends ListCell<ListGroupsObj>
    {
        @Override
        protected void updateItem(ListGroupsObj item, boolean empty)
        {
            super.updateItem(item, empty);
            if (item != null)
            {
                setText(item.getGroupId() + " - " + item.getGroupName());
            }
        }
    }

    private List<ListGroupsObj> lisGroups;

    public static class ListGroupsObj
    {

        private int groupId;
        private String groupName;

        public static ListGroupsObj newInstance()
        {
            return new ListGroupsObj();
        }

        public ListGroupsObj()
        {
        }

        public ListGroupsObj(int groupId, String groupName)
        {
            this.groupId = groupId;
            this.groupName = groupName;
        }

        public ListGroupsObj groupId(int groupId)
        {
            this.groupId = groupId;
            return this;
        }

        public ListGroupsObj groupName(String groupName)
        {
            this.groupName = groupName;
            return this;
        }

        public int getGroupId()
        {
            return groupId;
        }

        public String getGroupName()
        {
            return groupName;
        }

        @Override
        public String toString()
        {
            return groupId + " - " + groupName;
        }
    }
}
这条线就是问题所在:

listGroups.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<ListGroupsObj>()
        {

            @Override
            public void changed(ObservableValue<? extends ListGroupsObj> arg0, ListGroupsObj arg1, ListGroupsObj arg2)
            {
                if (arg2 != null)
                {
                    System.out.println("Selected Group: " + arg2.getGroupId() + " - " + arg2.getGroupName());
                }
            }
        });
listGroups.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener())
{
@凌驾

public void changed(ObservalEvalue问题在于您的组合框是可编辑的。当您编辑它(或单击它)时,它会尝试将该值设置为用作编辑器的文本字段中的值。该值是一个字符串:但您已创建组合框来存储ListGroupsObj类型的值

您需要关闭在中键入值的功能(即不调用
listGroups.setEditable(true)
),或者需要通过
listGroups.setConverter(…)
提供转换器。请使用此代码

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;

/**
 *
 * @author reegan
 */
public class Listobject extends Application {

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

    @Override
    public void start(Stage stage) {

        // Insert Some data

        final ComboBox<ListGroupsObj> listGroups = new ComboBox();


        listGroups.setButtonCell(new GroupListCell());
        listGroups.setCellFactory(new Callback<ListView<ListGroupsObj>, ListCell<ListGroupsObj>>() {
            @Override
            public ListCell<ListGroupsObj> call(ListView<ListGroupsObj> p) {
                return new GroupListCell();
            }
        });

        listGroups.setEditable(true);

        ListGroupsObj ob = ListGroupsObj.newInstance().groupId(12).groupName("Group12");
        listGroups.getItems().addAll(ob);
        ListGroupsObj osb = ListGroupsObj.newInstance().groupId(13).groupName("Group13");
        listGroups.getItems().addAll(osb);
        ListGroupsObj oa = ListGroupsObj.newInstance().groupId(14).groupName("Group14");
        listGroups.getItems().addAll(oa);
        ListGroupsObj oz = ListGroupsObj.newInstance().groupId(15).groupName("Group15");
        listGroups.getItems().addAll(oz);


        // second way to add object
        listGroups.getItems().add(new ListGroupsObj(12, "Group 12"));

        listGroups.setValue(ob);

        // Display the selected Group
//        listGroups.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<ListGroupsObj>() {
//            @Override
//            public void changed(ObservableValue<? extends ListGroupsObj> arg0, ListGroupsObj arg1, ListGroupsObj arg2) {
//                if (arg2 != null) {
//                    listGroups.setEditable(true);
//                    System.out.println("Selected Group: " + arg2.getGroupId() + " - " + arg2.getGroupName());
//                }
//            }
//        });


        listGroups.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Object>() {

            @Override
            public void changed(ObservableValue<? extends Object> ov, Object t, Object t1) {
//                 System.out.println("Selected Group:  " + t1.toString());
                 System.out.println("Selected Group : " + t1);
            }
        });

        final StackPane layout = new StackPane();
        layout.getChildren().add(listGroups);
        layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 15;");
        stage.setScene(new Scene(layout));
        stage.show();
    }

    class GroupListCell extends ListCell<ListGroupsObj> {

        @Override
        protected void updateItem(ListGroupsObj item, boolean empty) {
            super.updateItem(item, empty);
            if (item != null) {
                setText(item.getGroupId() + " - " + item.getGroupName());
            }
        }
    }
//    private List<ListGroupsObj> lisGroups;

    public static class ListGroupsObj {

        private int groupId;
        private String groupName;

        public static ListGroupsObj newInstance() {
            return new ListGroupsObj();
        }

        public ListGroupsObj() {
        }

        public ListGroupsObj(int groupId, String groupName) {
            this.groupId = groupId;
            this.groupName = groupName;
        }

        public ListGroupsObj groupId(int groupId) {
            this.groupId = groupId;
            return this;
        }

        public ListGroupsObj groupName(String groupName) {
            this.groupName = groupName;
            return this;
        }

        public int getGroupId() {
            return groupId;
        }

        public String getGroupName() {
            return groupName;
        }

        @Override
        public String toString() {
            return groupId + " - " + groupName;
        }

    }
}
导入javafx.application.application;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.scene.scene;
导入javafx.scene.control.ComboBox;
导入javafx.scene.control.ListCell;
导入javafx.scene.control.ListView;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
导入javafx.util.Callback;
/**
*
*@作者reegan
*/
公共类Listobject扩展应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公众假期开始(阶段){
//插入一些数据
最终组合框列表组=新组合框();
setButtonCell(新的GroupListCell());
setCellFactory(新回调(){
@凌驾
公共ListCell调用(ListView p){
返回新的GroupListCell();
}
});
listGroups.setEditable(true);
ListGroupsObj ob=ListGroupsObj.newInstance().groupId(12.groupName)(“Group12”);
listGroups.getItems().addAll(ob);
ListGroupsObj osb=ListGroupsObj.newInstance().groupId(13).groupName(“Group13”);
listGroups.getItems().addAll(osb);
ListGroupsObj oa=ListGroupsObj.newInstance().groupId(14.groupName)(“Group14”);
listGroups.getItems().addAll(oa);
ListGroupsObj oz=ListGroupsObj.newInstance().groupId(15.groupName)(“Group15”);
listGroups.getItems().addAll(oz);
//添加对象的第二种方法
添加(新的ListGroupsObj(12,“组12”);
设置值(ob);
//显示所选组
//listGroups.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener()){
//@覆盖

//公共无效已更改(ObservalEvalue将combobox editable设置为false

您能检查所选项目返回的对象类型吗Shi peter,请再解释一些………在您的问题中,将所有这些都清楚地拼出来:阅读开头的段落“因为combobox可以编辑…”我用转换器代码更新了端口。它能正常工作还是我必须编辑一些东西?它会运行。但是你不想从字符串中解析出groupID和groupName吗?只需要ID。我不需要名称。这根本不能解决根本问题。它允许用户将字符串放入ListGroupsObj的组合框中;你基本上已经坏了n组合框的类型安全性。如何破坏组合框的安全性将编译以下代码:
ListGroupsObj selectedItem=listGroups.getValue()
但如果在用户键入值后执行,则会生成ClassCastException。如果组合框是可编辑的,则需要安装一个转换器。您能否对您的答案进行进一步说明,或者以其他方式使其更清楚?我的答案是直截了当的
public class GroupConverter extends StringConverter<ListGroupsObj>
    {

        @Override
        public String toString(ListGroupsObj obj)
        {
            return obj.getGroupId() + " - " + obj.getGroupName();
        }

        @Override
        public ListGroupsObj fromString(String obj)
        {

            //TODO when you type for example "45 - NextGroup" you want to take only tyhe number"
            return ListGroupsObj.newInstance().groupName(obj);
        }

    }
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;

/**
 *
 * @author reegan
 */
public class Listobject extends Application {

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

    @Override
    public void start(Stage stage) {

        // Insert Some data

        final ComboBox<ListGroupsObj> listGroups = new ComboBox();


        listGroups.setButtonCell(new GroupListCell());
        listGroups.setCellFactory(new Callback<ListView<ListGroupsObj>, ListCell<ListGroupsObj>>() {
            @Override
            public ListCell<ListGroupsObj> call(ListView<ListGroupsObj> p) {
                return new GroupListCell();
            }
        });

        listGroups.setEditable(true);

        ListGroupsObj ob = ListGroupsObj.newInstance().groupId(12).groupName("Group12");
        listGroups.getItems().addAll(ob);
        ListGroupsObj osb = ListGroupsObj.newInstance().groupId(13).groupName("Group13");
        listGroups.getItems().addAll(osb);
        ListGroupsObj oa = ListGroupsObj.newInstance().groupId(14).groupName("Group14");
        listGroups.getItems().addAll(oa);
        ListGroupsObj oz = ListGroupsObj.newInstance().groupId(15).groupName("Group15");
        listGroups.getItems().addAll(oz);


        // second way to add object
        listGroups.getItems().add(new ListGroupsObj(12, "Group 12"));

        listGroups.setValue(ob);

        // Display the selected Group
//        listGroups.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<ListGroupsObj>() {
//            @Override
//            public void changed(ObservableValue<? extends ListGroupsObj> arg0, ListGroupsObj arg1, ListGroupsObj arg2) {
//                if (arg2 != null) {
//                    listGroups.setEditable(true);
//                    System.out.println("Selected Group: " + arg2.getGroupId() + " - " + arg2.getGroupName());
//                }
//            }
//        });


        listGroups.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Object>() {

            @Override
            public void changed(ObservableValue<? extends Object> ov, Object t, Object t1) {
//                 System.out.println("Selected Group:  " + t1.toString());
                 System.out.println("Selected Group : " + t1);
            }
        });

        final StackPane layout = new StackPane();
        layout.getChildren().add(listGroups);
        layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 15;");
        stage.setScene(new Scene(layout));
        stage.show();
    }

    class GroupListCell extends ListCell<ListGroupsObj> {

        @Override
        protected void updateItem(ListGroupsObj item, boolean empty) {
            super.updateItem(item, empty);
            if (item != null) {
                setText(item.getGroupId() + " - " + item.getGroupName());
            }
        }
    }
//    private List<ListGroupsObj> lisGroups;

    public static class ListGroupsObj {

        private int groupId;
        private String groupName;

        public static ListGroupsObj newInstance() {
            return new ListGroupsObj();
        }

        public ListGroupsObj() {
        }

        public ListGroupsObj(int groupId, String groupName) {
            this.groupId = groupId;
            this.groupName = groupName;
        }

        public ListGroupsObj groupId(int groupId) {
            this.groupId = groupId;
            return this;
        }

        public ListGroupsObj groupName(String groupName) {
            this.groupName = groupName;
            return this;
        }

        public int getGroupId() {
            return groupId;
        }

        public String getGroupName() {
            return groupName;
        }

        @Override
        public String toString() {
            return groupId + " - " + groupName;
        }

    }
}