gpt4 book ai didi

java - 如何设置组合框编辑器事件处理程序

转载 作者:行者123 更新时间:2023-11-30 01:51:03 25 4
gpt4 key购买 nike

我正在尝试将按键事件处理程序添加到简单 JavaFX 应用程序中的可编辑组合框。由于场景生成器不提供对组合框中文本字段的访问,因此我必须在代码中添加事件处理程序。

这是我添加处理程序的尝试。

主类

package sample;

import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.stage.Stage;

public class Main extends Application {

@FXML
private ComboBox combo;

@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();
combo.getEditor().setOnKeyTyped(c::handleComboKeyPress);
}


public static void main(String[] args) {
launch(args);
}
}

Controller 类

package sample;

import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import javafx.scene.input.KeyEvent;

public class Controller {
@FXML
private ComboBox combo;

public void handleComboKeyPress(KeyEvent ke)
{
System.out.print("key press. "); // debugging
String query = combo.getEditor().getText();
System.out.println(query); // debugging
}
}

FXML(样本.fxml)

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.layout.Pane?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<children>
<ComboBox fx:id="combo" editable="true" layoutX="75.0" layoutY="34.0" prefWidth="150.0" promptText="City, State" visibleRowCount="5" />
</children>
</Pane>

这会因 start 方法最后一行出现空指针异常而崩溃。问题是 combo 还没有值,因为(我假设)FXML 加载器在单独的线程中运行,并且在我的代码尝试调用 getEditor 时尚未完成。

设置事件处理程序更合适的方法是什么?

编辑:添加完整的源代码

最佳答案

start 方法需要访问 Controller 类中声明的 ComboBox 变量。在 Main 类中简单地使用 @FXML 注释 ComboBox 变量是不够的。

我通过向 Controller 类添加 getComboBox 方法解决了该问题。这将返回 combo 变量引用的 ComboBox 实例。

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所建议的,另一种(也是更好的)解决方案是在 Controller 中设置 keyTyped 处理程序。使用 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);
}
}

关于java - 如何设置组合框编辑器事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56046420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com