2017-03-07 3 views
2

質問に答えるうちにChoiceBox私は興味深い問題を発見しました(バグ、おそらく?)。 Java 1.8u60では、ChoiceBoxには、setOnShownsetOnShowingsetOnHiddensetOnHidingの4つのメソッドが追加されています。しかし、私はそれらを働かせることはできません!ChoiceBox onShown onHiddenメソッドは機能しませんJavaFX

public class ComboBoxSample extends Application { 

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

    @Override public void start(Stage stage) { 
     stage.setTitle("ComboBoxSample"); 
     Scene scene = new Scene(new Group(), 450, 250); 

     final ComboBox<String> comboBox = new ComboBox<>(); 
     comboBox.getItems().addAll(
       "[email protected]", 
       "isabella.jo[email protected]" 
     ); 

     comboBox.setOnShown(event -> { 
      System.out.println("ComboBox onShown"); 
      System.out.println(comboBox.getSelectionModel().getSelectedIndex()); 
     }); 
     comboBox.setOnShowing(event -> { 
      System.out.println("ComboBox setOnShowing"); 
      System.out.println(comboBox.getSelectionModel().getSelectedIndex()); 
     }); 

     ChoiceBox<String> choiceBox = new ChoiceBox<>(); 
     choiceBox.setItems(FXCollections.observableArrayList(
       "New Document", "Open ") 
     ); 

     choiceBox.setOnShown(event -> { 
      System.out.println("ChoiceBox onShown"); 
      System.out.println(choiceBox.getSelectionModel().getSelectedIndex()); 
     }); 

     choiceBox.setOnShowing(event -> { 
      System.out.println("ChoiceBox onShowing"); 
      System.out.println(choiceBox.getSelectionModel().getSelectedIndex()); 
     }); 

     choiceBox.setOnHidden(event -> { 
      System.out.println("ChoiceBox setOnHidden"); 
      System.out.println(choiceBox.getSelectionModel().getSelectedIndex()); 
     }); 

     choiceBox.getSelectionModel().selectedIndexProperty().addListener(e -> { 
      System.out.println("ChoiceBox selectedIndexProperty"); 
     }); 

     GridPane grid = new GridPane(); 
     grid.setVgap(4); 
     grid.setHgap(10); 
     grid.setPadding(new Insets(5, 5, 5, 5)); 
     grid.add(new Label("ComboBox: "), 0, 0); 
     grid.add(comboBox, 1, 0); 
     grid.add(new Label("ChoiceBox: "), 0, 1); 
     grid.add(choiceBox, 1, 1); 

     Group root = (Group)scene.getRoot(); 
     root.getChildren().add(grid); 
     stage.setScene(scene); 
     stage.show(); 
    } 
} 

ComboBoxの両方setOnShownsetOnShowing方法はうまく動作しますが、ChoiceBoxコンソール出力用selectedIndexPropertyリスナーを除いて空になっています。 これは既知のバグですか? '関連するものが見つかりませんでした。それとも、コードに何か問題がありますか?

最新のJDK v1.8.0_121を使用します。

+0

[ドキュメント](https://docs.oracle .com/javase/8/javafx/api/javafx/scene/control/ChoiceBox.html)はこれらのメソッドをリストしていませんr 'ChoiceBox'だから私はそれもコンパイルに驚いています.... – Itai

+0

@sillyflyええ、私はOracleチームにバグを提出しました。 – Enigo

答えて

1

はい、実際にはバグのようです。

ChoiceBoxのコードを調べると、次のようになります。ChoiceBoxこれらのイベントは間違ったイベントタイプで発生します。

次のコードが実行されるハンドラを設定した場合:ON_SHOWNChoiceBoxの静的フィールドとして定義されて

private ObjectProperty<EventHandler<Event>> onShown = new ObjectPropertyBase<EventHandler<Event>>() { 
    @Override protected void invalidated() { 
     setEventHandler(ON_SHOWN, get()); 
    } 

    .... 
}; 

:イベントが発生し

しかし
public static final EventType<Event> ON_SHOWN = 
     new EventType<Event>(Event.ANY, "CHOICE_BOX_ON_SHOWN"); 

..

Event.fireEvent(this, value ? new Event(ComboBoxBase.ON_SHOWN) : 
      new Event(ComboBoxBase.ON_HIDDEN)); 

...それはComboBoxBase.ON_SHOWN ev ent型。

コピーペースト - 更新の問題を忘れてしまったようです。

手短に言えば、ハンドラを設定すると間違ったイベントタイプが予想されるため、それらは機能しません。それはあなたがComboBoxBaseで定義されたトリガーされたイベントのタイプを聞くことができ、固定されるまでの回避策として


EventFilter

choiceBox.addEventFilter(ComboBoxBase.ON_SHOWN, e -> 
    System.out.println("ComboBoxBase.ON_SHOWN was fired")); 

またはEventHandlerと:

choiceBox.addEventHandler(ComboBoxBase.ON_SHOWN, e-> 
    System.out.println("ComboBoxBase.ON_SHOWN was fired")); 

JDKのバグチケット:JDK-8175963 : ChoiceBox using events from ComboBox

+0

すばらしい解決策!もちろん、 'ChoiceBox 'に' ComboBoxBase'イベントタイプを使用するのはちょっと変わっています)とにかく、私はOracleチームにバグを提出しました。 – Enigo

+0

JDKチケットへのリンクを含む回答が更新されました。 – DVarga

関連する問題