无法在JavaFX组合框中强制转换对象
我有一个组合框,用户可以按ID和名称显示数据:无法在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
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;
}
}
}