2017-10-28 173 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(); 

}