[英]Java fx editable combobox with objects
我剛開始學習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”
編輯:添加適當的工作代碼
您在stringconverter中有一個空指針異常,因為您可以獲得一個null用戶。
您的字符串轉換器應該只在不修改項目的情況下將User轉換為String或從String轉換,因為您不知道它將被調用多少時間。
要添加用戶,我在添加新用戶的組合中添加一個on事件處理程序(當您鍵入enter時)。
請注意,由於字符串轉換器,您可以在組合框上調用getValue並獲取具有輸入名稱的用戶
您應該添加一個加號按鈕來提交用戶而不是我的on事件處理程序
這是我的工作示例:
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.