gpt4 book ai didi

javafx - 在 JavaFX ComboBox 中转换字符串

转载 作者:行者123 更新时间:2023-12-04 20:06:37 29 4
gpt4 key购买 nike

我正在尝试使用它从自定义组合框中选择一个值:

import java.util.List;
import javafx.application.Application;
import static javafx.application.Application.launch;
import static javafx.application.Application.launch;
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;
import javafx.util.StringConverter;

public class MainApp extends Application
{

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

@Override
public void start(Stage stage)
{

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);
listGroups.setConverter..............

// Insert Some data
ListGroupsObj ob = ListGroupsObj.newInstance().groupId(12).groupName("Test");
listGroups.getItems().addAll(ob);
ListGroupsObj osb = ListGroupsObj.newInstance().groupId(13).groupName("Test2");
listGroups.getItems().addAll(osb);
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: " + arg1.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> listGroups;

public static class ListGroupsObj
{

private int groupId;
private String groupName;

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

public ListGroupsObj()
{
}

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;
}
}

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);
}

}
}

当我在组合框外部单击时出现此错误:
Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: java.lang.String cannot be cast to com.selectmenuexample.MainApp$ListGroupsObj

我发现这可以使用转换器来完成,但我现在知道如何使用它。你能帮助这个实现吗?

最佳答案

这是错误的:

  • 你调用你的 ComboBox 列表组 和您的元素 list 列表组 .所以在你的开始代码中,你隐藏了那个变量。所以我删除了那个无用的变量,因为你可以直接在 ComboBox 中操作项目。
  • 你基本上有三种方法/变量做完全相同的事情。将您的对象转换为字符串,它们之间带有“ - ”。所以我删除了 GroupConverter 和自定义 细胞工厂 .您不需要它们,因为您的 ListGroupsObj 中已经有了“toString()”方法,它正在完成这项工作。

  • 然后你误解了 ComboBox 是如何工作的。如果它是可编辑的,则 ComboBox 将允许在 TextField 中键入内容。这就是 StringConverter 的来源。它将允许您在 String 和您的 ListGroupsObj 之间进行转换以及其他方式。

    为了从 ListGroupsObj 转到 String,只需在对象上调用“toString()”方法。

    但反过来,您应该创建一个新的 ListGroupsObj,或者验证 ComboBox 中的内容是否已经不是您的一项。例如,如果您在组合框中选择一个项目,将调用 fromString()。但是您不想创建一个新的 ListGroupsObj,您只想隔离您的项目列表中的 ListGroupsObj 并返回它。

    现在,您可以保证在 ComboBox 上调用 getValue() 将始终返回 ListGroupsObj 对象,因为您提供了自定义且有效的 StringConverter。

    这是您的代码的简化和工作版本:
    import javafx.application.Application;
    import static javafx.application.Application.launch;
    import javafx.scene.Scene;
    import javafx.scene.control.ComboBox;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    import javafx.util.StringConverter;

    public class MainApp extends Application {

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

    @Override
    public void start(Stage stage) {

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

    comboBox.setEditable(true);
    comboBox.setConverter(new StringConverter<ListGroupsObj>() {

    @Override
    public String toString(ListGroupsObj obj) {
    return obj.toString();
    }

    @Override
    public ListGroupsObj fromString(String obj) {
    //Here we try to identify if the given String actually represents one item of our list
    for(ListGroupsObj tempObj:comboBox.getItems()){
    if(tempObj.toString().equals(obj)){
    return tempObj;
    }
    }
    //If not we just create a new one
    return ListGroupsObj.newInstance().groupName(obj);
    }
    });

    // Insert Some data
    ListGroupsObj ob = ListGroupsObj.newInstance().groupId(12).groupName("Test");
    comboBox.getItems().addAll(ob);
    ListGroupsObj osb = ListGroupsObj.newInstance().groupId(13).groupName("Test2");
    comboBox.getItems().addAll(osb);
    comboBox.setValue(ob);

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

    public static class ListGroupsObj {

    private int groupId;
    private String groupName;

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

    public ListGroupsObj() {
    }

    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;
    }
    }
    }

    PS:这个问题已经在官方 JavaFX issue Tracker 中提出,我将在此处留下链接,因为票证中有另一个示例(需要登录): https://javafx-jira.kenai.com/browse/RT-29118

    关于javafx - 在 JavaFX ComboBox 中转换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24707401/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com