2015-06-19 67 views
1

ComboBox控件有一个名为setOnAction的方法。此方法采用的是,由文档描述被称为一个事件处理程序:如何以编程方式选择项目时触发ComboBox EventHandler?

组合框的动作,每当在组合框值 属性被改变时调用。这可能是由于值属性为 以编程方式更改,当用户选择弹出式对话框 中的项目时,或者在可编辑组合框的情况下,它可能是当用户提供其自己的输入(是通过

一个文本字段或一些 其他输入机制,当级中的第一负载,我不想组合框默认为空值,我希望它自动选择ComboBox中第一个选项(如果它有一个)getSelectionModel(),selectFirst()方法确实会改变ComboBox的选择,但是由于某种原因它不会触发EventHandler,但是,调用完全相同方法的按钮的EventHandler 导致EventHandler触发。我究竟做错了什么?

这里是一个简短的测试案例,显示使用JDK 8u40此行为:

import javafx.application.*; 
import javafx.stage.*; 
import javafx.scene.*; 
import javafx.scene.layout.*; 
import javafx.scene.control.*; 

public class Test extends Application { 

    public void start(Stage stage) throws Exception { 
     HBox pane = new HBox(); 
     ComboBox<String> comboBox = new ComboBox<>(); 
     comboBox.getItems().add("Hello"); 
     comboBox.getItems().add("World"); 
     comboBox.setOnAction((e) -> { 
      System.out.println(comboBox.getSelectionModel().getSelectedItem()); 
     }); 
     Button button = new Button("Select First"); 
     button.setOnAction((e) -> { 
      comboBox.getSelectionModel().selectFirst(); 
     }); 

     comboBox.getSelectionModel().selectFirst(); 

     pane.getChildren().add(comboBox); 
     pane.getChildren().add(button); 
     Scene scene = new Scene(pane); 
     stage.setScene(scene); 
     stage.show(); 
    } 
} 
+2

你也可以用'valueProperty()'注册一个监听器。当值改变时,该监听器将被通知(不管它如何改变) –

回答

4

我不完全理解为什么这是必要的,但为了使事件处理程序传递给setOnAction()方法触发组合框控件时,必须首先使用show()方法显示舞台。

import javafx.application.*; 
import javafx.stage.*; 
import javafx.scene.*; 
import javafx.scene.layout.*; 
import javafx.scene.control.*; 

public class Test extends Application { 

    public void start(Stage stage) throws Exception { 
     HBox pane = new HBox(); 
     ComboBox<String> comboBox = new ComboBox<>(); 
     comboBox.getItems().add("Hello"); 
     comboBox.getItems().add("World"); 
     comboBox.setOnAction((e) -> { 
      System.out.println(comboBox.getSelectionModel().getSelectedItem()); 
     }); 
     Button button = new Button("Select First"); 
     button.setOnAction((e) -> { 
      comboBox.getSelectionModel().selectFirst(); 
      System.out.println("The button did it!"); 
     }); 

     button.fire(); 

     pane.getChildren().add(comboBox); 
     pane.getChildren().add(button); 
     Scene scene = new Scene(pane); 
     stage.setScene(scene); 
     stage.show(); 

     comboBox.getSelectionModel().selectFirst(); 
    } 
} 

对于所有的控件,这似乎并不完全正确。在上面的示例中,即使在显示舞台之前,调用按钮上的fire()方法也会触发EventHandler。

相关问题