2015-06-19 118 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。

相關問題