【问题标题】:Java FX Scene Builder: Handling Multiple mouseClick() events from different source objectsJava FX Scene Builder:处理来自不同源对象的多个 mouseClick() 事件
【发布时间】:2018-10-20 03:45:14
【问题描述】:

我是 Java FX 的新手,尤其是场景构建器的新手。我有一个基于体重计算成绩的小应用程序。我向它添加了一个菜单栏,但 Scene Builder 只会让我在事件上绑定一个 mouseClick()。问题是,我已经有一个与此事件相关的计算按钮(用于计算成绩)。我希望我的MenuItem 在单击时打开我创建的对话框。

这是我目前让该方法起作用的尝试:

@FXML
    public void mouseClick(MouseEvent mouseEvent)
    {
        if (mouseEvent.getSource().equals(calcBtn))
        {
            DecimalFormat df = new DecimalFormat("#.##");
            double result = calcGrade();
            resultLbl.setText("Overall Grade: " + df.format(result) + "%");
        }
        if (mouseEvent.getSource().equals(aboutMenu))
        {
            DialogBox.showInformation("About", "Some dialog here.");
        }
    }

在 Swing 中,我记得做过这样的事情来处理多个源对象:

if (e.getSource() == menuItem)
{
    //do stuff
}
else if (e.getSource() == calculateBtn)
{
    //calculate stuff 
}

但是这不起作用,计算按钮的代码无论如何都会执行。

由于 Scene Builder 将动作绑定到 Controller 类的方式,我不确定在单击鼠标按钮时如何分离这两个不同来源之间的动作。当我尝试在事件上绑定自定义时,场景构建器对我大喊大叫,并且只允许 mouseClick()。处理这种情况有什么好的解决方案?

【问题讨论】:

  • 原则上做法是正确的,代码没有错误。这意味着问题出在其他地方。

标签: java javafx scenebuilder


【解决方案1】:

我建议对这两个事件使用不同的处理程序方法。此外,应该使用onAction 事件处理程序(MenuItems 不是Nodes 因此不能是MouseEvents 的来源):

<MenuItem text="Do Something" onAction="#doSomething" />
...
<Button text="Do something else" onAction="#doSomethingElse" />
@FXML
private void doSomething() {
    System.out.println("Menu Item clicked");
}

@FXML
private void doSomethingElse() {
    System.out.println("Button clicked");
}

这样更容易维护代码。 (想象一下,您需要更改其中一个菜单项的操作实现,并使用相同的方法处理其中的 30 个;您需要多长时间才能找到 if/else if 的正确部分。大多数 IDE 支持导航到一个方法。)


如果你想坚持检查源,只要事件类型可以分配给方法参数,你应该没问题:

<MenuItem fx:id="menuItem" text="Do Something" onAction="#doSomething" />
...
<Button fx:id="button" text="Do something else" onAction="#doSomething" />
@FXML Button button;
@FXML MenuItem menuItem;

@FXML
private void doSomething(ActionEvent event) {
    Object source = event.getSource();
    if (button == source) {
        System.out.println("button clicked");
    } else if (menuItem == source) {
        System.out.println("menu item clicked");
    }
}

如果您想使用相同的方法处理MouseEvents 和ActionEvents,您可能需要将方法的参数类型更改为Event

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    相关资源
    最近更新 更多