gpt4 book ai didi

带有对象的 Javafx 可编辑组合框

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:00 24 4
gpt4 key购买 nike

我刚刚开始学习 Java Fx。我有一个装满对象的组合框。我处理了 toString() 方法,我可以看到我想在屏幕上显示的名称。但现在我想让它可编辑,用户将输入自己的文本,ComboBox 将创建一个新对象并将该文本放入正确的字段中。我知道问题出在转换器 FromString 或 ToString 中,但我无法处理它。

package mnet;

import javafx.application.Application;
import javafx.scene.control.ComboBox;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.util.StringConverter;

public class sample extends Application {
Stage window;

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

public void start(Stage primaryStage) {

window = primaryStage;
window.setTitle("Sample");
GridPane grid = new GridPane();
User usr1 = new User("Witold", "ciastko");
User usr2 = new User("Michał", "styk");
User usr3 = new User("Maciej", "masloo");
ComboBox<User> combo1 = new ComboBox<User>();
combo1.getItems().addAll(usr1, usr2, usr3);
combo1.setConverter(new StringConverter<User>() {
@Override
public String toString(User usr) {
return usr.getName();
}

@Override
public User fromString(String s) {
User usr = new User(s, "haslo");
combo1.getItems().add(usr);
return usr;
}
});
combo1.setEditable(true);
combo1.valueProperty().addListener((v, oldValue, newValue) -> {
System.out.println(newValue);
});
GridPane.setConstraints(combo1, 2, 1);
grid.getChildren().addAll(combo1);
Scene scene = new Scene(grid, 400, 200);
window.setScene(scene);
window.show();

}
}

package mnet;

public class User {
String user;
String password;

public User() {
this.user="";
this.password="";
}
public User(String user, String password){
this.user=user;
this.password=password;
}

public String getName(){
return this.user;
}
}

如果我摆脱 StringConverter 它工作正常,但我只看到对象的地址而不是用户名,就像这样“mnet.User@1f3b971”

编辑:添加了适当的工作代码

最佳答案

你在字符串转换器中有一个空指针异常,因为你可以获得一个空用户。

您的字符串转换器应该只在不修改项目的情况下将 User 转换为 String 或从 String 转换为 String,因为您不知道它将被调用多少次。

为了添加用户,我在添加新用户的组合上添加了一个 on 事件处理程序(当您键入 enter 时)。

请注意,由于有了字符串转换器,您可以在组合框上调用 getValue 并获得具有输入名称的用户

您应该添加一个加号按钮来提交用户而不是我的事件处理程序

这里是我的工作示例:

public class Main extends Application {
Stage window;

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

@Override
public void start(Stage primaryStage) {

window = primaryStage;
window.setTitle("Sample");
GridPane grid = new GridPane();
User usr1 = new User("Witold", "ciastko");
User usr2 = new User("Michał", "styk");
User usr3 = new User("Maciej", "masloo");
ComboBox<User> combo1 = new ComboBox<User>();
combo1.getItems().addAll(usr1, usr2, usr3);
combo1.setConverter(new StringConverter<User>() {
@Override
public String toString(User usr) {
return usr == null ? "" : usr.getName();
}

@Override
public User fromString(String s) {
User usr = new User(s, "haslo");
return usr;
}
});
combo1.setEditable(true);
combo1.addEventHandler(KeyEvent.KEY_RELEASED, e -> {
if (e.getCode() == KeyCode.ENTER) {
combo1.getItems().add(combo1.getValue());
}

});
GridPane.setConstraints(combo1, 2, 1);
grid.getChildren().addAll(combo1);
Scene scene = new Scene(grid, 400, 200);
window.setScene(scene);
window.show();

}

关于带有对象的 Javafx 可编辑组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46988860/

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