繁体   English   中英

Java FX Scene Builder:处理来自不同源对象的多个mouseClick()事件

[英]Java FX Scene Builder: Handling Multiple mouseClick() events from different source objects

我是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() 处理此类情况的一个好的解决方案是什么?

我建议对两个事件使用不同的处理程序方法。 此外,应该使用onAction事件处理程序( MenuItem不是Node因此不能作为MouseEvent的源):

<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支持导航方法)。


如果您要坚持检查源,那么只要事件类型可分配给method参数,就可以了:

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

如果要使用同一方法处理MouseEventActionEvent ,则可能需要将方法的参数类型更改为Event

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM