2017-10-28 171 views
3

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

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

如果我摆脱的字符串转换它正常工作,但不是用户名,我只看到对象的地址,像这样的“[email protected]

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

+0

发表[mcve]。您发布的程序不会重现您描述的内容(并且存在编译错误)。 – user1803551

+1

当我运行你的代码时,我在'return usr.getName();'上得到了一个N​​PE。 – user1803551

回答

1

由于您可以获得空用户,因此您在stringconverter中有空指针异常。

您的字符串转换器应该只将用户转换为字符串而不修改项目,因为您不知道它将被调用多少次。

要添加一个用户,我在添加一个新用户的组合上添加一个事件处理程序(当您键入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(); 

}