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

如何为多个支票盒制作一个动作事件?

李康安
2023-03-14

我在JavaFX中创建了一个应用程序,其中有很多选择框(大约100个)。单击它们中的每一个会更改一个布尔变量的状态(选中-真,未选中-假)。我对每个选择框都有ActionEvent,但我想制作支持所有它们的操作事件。

其中一个ActionEvent看起来像:

public void onActionClick(ActionEvent actionEvent) {
    if(firstCheckbox.isSelected()){
        firstBooleanValue=true;
    } else {
        firstBooleanValue=false;
    }
}

第二个看起来很相似:

public void onActionClick(ActionEvent actionEvent) {
    if(secondCheckbox.isSelected()){
        secondBooleanValue=true;
    } else {
        secondBooleanValue=false;
    }
}

我从我的朋友那里听说我应该使用EventHandler创建类并传递参数(复选框和布尔变量),但我不知道怎么做。有什么解决方案吗?

共有1个答案

闻人博
2023-03-14

我从朋友那里听说我应该用EventHandler创建一个类,并传递参数(复选框和布尔变量)

除非您想为布尔变量使用容器类(例如布尔属性),否则实际上不可能以允许您编写变量的方式传递变量。你当然可以通过消费者

(理论上,可以通过反射访问字段来写入值,但我强烈建议不要这样做。)

在事件处理程序中,您可以使用< code>source属性来获取触发更改的对象(< code >复选框)。这个事实将允许您创建一个< code >映射

private boolean a;
private boolean b;
private boolean c;
private Map<CheckBox, Consumer<Boolean>> eventMap = new HashMap<>();

private void comboAction(ActionEvent event) {
    CheckBox cb = (CheckBox) event.getSource();
    eventMap.get(cb).accept(cb.isSelected());
}

@Override
public void start(Stage primaryStage) {
    CheckBox cb1 = new CheckBox("a");
    CheckBox cb2 = new CheckBox("b");
    CheckBox cb3 = new CheckBox("c");

    // tell event handler what to do with the booleans
    eventMap.put(cb1, v -> a = v);
    eventMap.put(cb2, v -> b = v);
    eventMap.put(cb3, v -> c = v);

    // register event handlers
    EventHandler<ActionEvent> onAction = this::comboAction;

    for (CheckBox cb : eventMap.keySet()) {
        cb.setOnAction(onAction);
    }

    Button button = new Button("print");
    button.setOnAction(evt -> {
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println("-------");
    });

    Scene scene = new Scene(new VBox(cb1, cb2, cb3, button));
    primaryStage.setScene(scene);
    primaryStage.show();
}

但是,单个类中有 100 个布尔字段这一事实表明存在设计问题。请考虑将数据存储在不同的数据结构中,如列表地图或类似的数据结构。您还可以将CheckBoxes存储在这样的数据结构中,这将使onAction事件处理程序的使用变得不必要;您可以简单地检索负责该属性的复选框,并在您需要值时使用 isSelected...

 类似资料:
  • 问题内容: 我正在一个Java应用程序中工作,我需要同时执行这两个查询(如Java中的Strings),并在出现错误的地方回滚事务。 更新 我创建了一个字符串,其中两个查询用注释建议分隔开 更新 我已经尝试了JDBC原子事务作为Java中的代码。我强迫第二个sql失败,但是即使我指定.setAutoCommit(false); dblink通过第一个查询影响了另一个数据库。我在没有dblink事务

  • 问题内容: 问题 如何制作一个Ajax按钮(向上和向下箭头),以便数字可以增加或减少 如何将用户的操作保存到变量NumberOfVotesOfQuestionID 我不确定是否应该对变量使用数据库。但是,我知道还有一种更简单的方法可以节省投票数。 您如何解决这些问题? [编辑] 服务器端编程语言是Python。 问题答案: 这是使用jQuery / Django的肮脏/未经尝试的理论实现。 我们将

  • 问题内容: 我如何才能向中添加一堆类,然后再从中检索一个类(派生自,但不是),并使用它来生成实际检索到的类的新对象(即,因为那不是抽象的) 所有需要添加的类都源自同一个 抽象 基类() 我真的想不出另一种方法来实现自己的目标,所以希望这是可能的…? 问题答案: 为了防止使用反射,您可能正在寻找抽象工厂模式。这是一个简单的示例,说明如何使用Java 8实现它:

  • 我正在使用Felix Framework将Jetty 9.2作为osgi包运行,在命令提示符下,Apache Felix的启动方式如下 我的jetty home是这样的 启动felix框架后,在命令提示符中,我可以看到以活动状态加载的绑定列表。 但仍然得到相同的错误。有谁好心的建议我如何配置我的JSP在这种情况下..?

  • 使用嵌套for loops语句绘制“*”s的空心框。这些框的行数和列数相同,该数字应由用户输入(有效范围:5到21)。我想不出办法把盒子弄空心。这是我的代码,它是一个完整的正方形,但我需要它是空心的或只是边界。 输出应该是这样的:有多少行/列(5-21)?25超出范围。重新输入: 7

  • 问题内容: 问题 如何制作一个Ajax按钮(向上和向下箭头),以便数字可以增加或减少 如何将用户的操作保存到变量NumberOfVotesOfQuestionID 我不确定是否应该对变量使用数据库。但是,我知道还有一种更简单的方法可以节省投票数。 您如何解决这些问题? [编辑] 服务器端编程语言是Python。 问题答案: 这是使用jQuery / Django的肮脏/未经尝试的理论实现。 我们将