Методу start
необходим доступ к переменной ComboBox, объявленной в классе Controller. Недостаточно просто аннотировать переменную ComboBox с помощью @FXML
в классе Main.
Я решил проблему, добавив метод getComboBox
в класс Controller. Это вернет экземпляр ComboBox, указанный в переменной combo
.
public ComboBox getComboBox()
{
return combo;
}
В классе Main используйте этот метод, чтобы перейти к редактору, лежащему в основе ComboBox:
Controller c = loader.getController();
c.getComboBox().getEditor().setOnTyped(c::handleComboKeyPress);
Вот пересмотренный Основной класс:
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root = loader.load();
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 400, 300));
primaryStage.show();
Controller c = loader.getController();
c.getComboBox().getEditor().setOnKeyTyped(c::handleComboKeyPress);
}
Лучшее решение
Как предложено @Slaw ниже, альтернативным (и лучшим) решением является установка обработчика keyTyped в Controller. Используйте метод initialize
, который автоматически вызывается загрузчиком, если он существует.
public void initialize()
{
combo.getEditor().setOnKeyTyped(this::handleComboKeyPress);
}
Вот весь класс Controller (за исключением импорта):
public class Controller {
@FXML
private ComboBox combo;
public void handleComboKeyPress(KeyEvent ke)
{
// Do stuff
System.out.println("key pressed.");
}
public void initialize()
{
combo.getEditor().setOnKeyTyped(this::handleComboKeyPress);
}
}