2015-06-19 2 views
1

Управление ComboBox имеет метод под названием setOnAction. Этот метод принимает в EventHandler, что называется, как описано в документации:Как заставить ComboBox EventHandler запускаться при программном выборе элементов?

The ComboBox действие, которое вызывается всякий раз, когда значение ComboBox свойства изменяется. Это может быть связано с тем, что значение value имеет значение , когда пользователь выбирает элемент во всплывающем списке или диалоговом окне , или, в случае редактируемых ComboBox, может быть, когда пользователь предоставляет свой собственный вход (это через TextField или какой-то другой механизм ввода.

При первой стадии нагрузка, я не хочу, чтобы ComboBox по умолчанию пустого значения, я хочу, чтобы автоматически выбрать первый вариант в 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

Я не совсем понимаю, зачем это нужно, но для того, чтобы EventHandler передается методу setOnAction() для триггер для элемента управления ComboBox, этап должен сначала отображаться с помощью метода 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 еще до того, как будет показан этап.

Смежные вопросы