在回答关于.setInterpolator(new BounceInterpolator())
的问题时,我发现了一个有趣的问题(可能是错误?)。在Java 1.8u60中,为ChoiceBox
添加了以下四种方法:ChoiceBox
,setOnShown
,setOnShowing
,setOnHidden
。但我无法让他们工作!
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();
}
}
,ComboBox
和setOnShown
两种方法都可以正常工作,但对于setOnShowing
控制台,除ChoiceBox
侦听器外,其输出为空。
这是一个已知的错误吗?因为我找不到任何相关的东西。或者代码有问题?
我使用最新的JDK v1.8.0_121。
答案 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