当前位置: 首页 > 知识库问答 >
问题:

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

皮嘉德
2023-03-14

我试图在一个简单的JavaFX应用程序中向一个可编辑的组合框中添加一个关键事件处理程序。由于场景构建器不提供对组合框中的TextField的访问,我不得不在代码中添加事件处理程序。

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

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);
    }
}
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
    }
}
<?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>

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

编辑:添加完整的源代码

共有1个答案

曾修真
2023-03-14

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);
    }
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);
    }
}
 类似资料:
  • 我正在尝试使用一个可编辑的组合框。因为我想添加一个用于按回车键的监听器。我尝试了下面的选项,但都不起作用。:( < code>cmb_year是组合框对象。

  • 您的代码编辑器是您主要的开发工具;你使用它来编写和保存代码。通过学习编辑器的快捷方式和安装主要的插件,可以使你更好,更快编写代码。 TL;DR 选择一个编辑器,您可以自定义快捷方式,并有许多插件可以帮助您更好,更快编写代码。 使用包管理器,以便使你更容易发现,安装和更新插件。 安装有助于提高开发效率的插件;使用本指南中的建议。 安装 Sublime text 编辑器 Sublime是一个伟大的编辑

  • 关于文章Spring批处理CompositeItemWriter如何管理委托编写器的事务?,对于复合项编写器事务管理,难道不应该将数据源包装在如下所示的事务管理器中吗?没有下面的bean定义,事务管理就无法与Oracle和Hikari CP一起工作。不确定帖子中提供的示例是如何工作的。请澄清

  • 当使用内联编辑将新项目添加到剑道网格中时,数据源由所选的过滤。添加一行后,列不再可编辑(使用进行设置),但是可编辑的。不幸的是,级联不能用于编辑,的数据源未经过滤。 为了解决这个问题,我订阅了编辑事件()并手动过滤数据源。这是可行的,但是更新按钮不做任何事情,编辑就会丢失。

  • 问题内容: 如果我想将cq5组件设置为在A页中可编辑但在B页中不可编辑,是否可以。 例如:在A页上,我有C组件,我们允许作者打开对话框并编辑该组件。但是我们不允许作者打开对话框来编辑页面B上的组件C。我尝试研究cq:EditConfig 链接,但这还不足以解决我的问题。 问题答案: 您可以在包含之前设置ComponentContext.BYPASS_COMPONENT_HANDLING_ON_IN

  • 我正在尝试设置组合框的文本颜色。 我尝试的代码