2017-10-28 19 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; 
    } 
} 

私はStringConverterを取り除く場合、それは正常に動作しますが、代わりにユーザーの名前の私は、この「[email protected]

EDITのようなオブジェクトのアドレスを参照してください。適切な作業コードを追加しました

+0

ポスト[mcve]。あなたが投稿したプログラムは、あなたが記述したものを再現しません(そして、コンパイルエラーがあります)。 – user1803551

+1

あなたのコードを実行すると、 'return usr.getName();'でNPEを取得します。 – user1803551

答えて

1

nullユーザーを取得できるので、stringconverterでNULLポインタ例外があります。

文字列コンバータは、呼び出される時間がわからないため、項目を変更せずにユーザーを/から文字列に変換する必要があります。

ユーザーを追加するには、新しいユーザーを追加するコンボに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(); 

} 
関連する問題