我试图从不可编辑的JavaFXML组合框中选择一个项目,然后简单地输出结果。我通过以下方式在组合框上使用了鼠标单击事件:
public AppController() {
ageCBox = new ComboBox<>(MainApp.setYearCBoxView());
ageCBox.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent) ->
{
System.out.println("His age is ageCBox.getSelectionModel().getSelectedItem());
});
}
我现在已经成功初始化了cBox,因为我已经在许多其他应用中重用了此控件。
当我单击组合框时会发生以下顺序:
Click 1: Open the selection list by clicking the CBox chevron: Result: “His age is null”.
Click 2: Select ‘21’ from the selection list: Result: nothing printed
Click 3: Open the selection list by clicking the CBoc chevron: Result: “His age is 21”.
Click 4: Select ‘25’ from the selection list: Result: nothing printed
我想发生的事情是:
Click 1: Result: nothing printed
Click 2: Result: “His age is 21”
Click 3: Result: nothing printed
Click 4: Result: “His age is 25”
通过使用SceneBuilder定义CBox并将CBox绑定到控制程序中的FXML处理程序和FXML变量,我已经成功地完成了这一工作。但是我不想这样定义我的ageCBox,因为我的数据输入区域GridPane必须在不同的GridPane单元内外交换不同的控件。我不希望这些不需要使用的“变量”控件在GUI视图中徘徊。我可以通过使用SceneBuilder在界面上的其他位置指定控件(具有可见性和启用的设置“ false”),然后将其“移动”到所需的网格窗格单元并将设置设置为“ true”,从而实现所需的功能尽管我觉得这是一种笨拙而不是最佳的方法。
在Swing中,事件处理程序上有一个方法如下:
private void getRowDetail(ListSelectionEvent e)
{
if (e.getValueIsAdjusting() ) {
return;
}
else carry on..
据我所知,这避免了FXML处理程序当前遇到的问题,在该问题中似乎不支持getValueIsAdjusting或ListSelection事件。
用以下内容完美替代上述内容:
在AppController构造函数中,我输入:
ageCBox.getSelectionModel().selectedItemProperty().addListener(
(observable, oldValue, newValue) -> handleAgeComboBox());
然后为了验证它是否起作用,我创建了一个处理程序方法:
private void handleAgeComboBox(){
System.out.println("His age is " + ageCBox.getSelectionModel().getSelectedItem());
}