ChoiceBox onShown \ onHidden方法不适用于JavaFX

时间:2017-03-07 06:35:10

标签: java javafx

在回答关于.setInterpolator(new BounceInterpolator())的问题时,我发现了一个有趣的问题(可能是错误?)。在Java 1.8u60中,为ChoiceBox添加了以下四种方法:ChoiceBoxsetOnShownsetOnShowingsetOnHidden。但我无法让他们工作!

setOnHiding

对于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( "jacob.smith@example.com", "isabella.johnson@example.com" ); 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(); } } ComboBoxsetOnShown两种方法都可以正常工作,但对于setOnShowing控制台,除ChoiceBox侦听器外,其输出为空。 这是一个已知的错误吗?因为我找不到任何相关的东西。或者代码有问题?

我使用最新的JDK v1.8.0_121。

1 个答案:

答案 0 :(得分:1)

是的,它确实似乎是一个错误。

检查ChoiceBox的代码会导致以下情况:private ObjectProperty<EventHandler<Event>> onShown = new ObjectPropertyBase<EventHandler<Event>>() { @Override protected void invalidated() { setEventHandler(ON_SHOWN, get()); } .... }; 使用错误的事件类型触发这些事件。

设置处理程序时,执行以下代码:

ON_SHOWN

其中ChoiceBox被定义为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

...它使用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"));

 public interface IFn extends Callable, Runnable
 public class Keyword implements IFn

JDK错误提示:JDK-8175963 : ChoiceBox using events from ComboBox