Java FX Scene Builder:处理来自不同源对象的多个 mouseClick() 事件
Java FX Scene Builder: Handling Multiple mouseClick() events from different source objects
我是 java FX 的新手,尤其是场景生成器的新手。我有一个根据体重计算成绩的小应用程序。我向其中添加了一个菜单栏,但 Scene Builder 只允许我绑定一个 mouseClick()
on 事件。问题是,我已经有一个与此事件相关的计算按钮(用于计算成绩)。我希望我的 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 将动作绑定到控制器的方式 class,我不确定在单击鼠标按钮时如何区分这两个不同源之间的动作。当我尝试绑定自定义事件时,场景生成器对我大吼大叫,只允许 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 的正确部分。大多数 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");
}
}
如果您想使用相同的方法处理 MouseEvent
和 ActionEvent
,您可能需要将方法的参数类型更改为 Event
。
我是 java FX 的新手,尤其是场景生成器的新手。我有一个根据体重计算成绩的小应用程序。我向其中添加了一个菜单栏,但 Scene Builder 只允许我绑定一个 mouseClick()
on 事件。问题是,我已经有一个与此事件相关的计算按钮(用于计算成绩)。我希望我的 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 将动作绑定到控制器的方式 class,我不确定在单击鼠标按钮时如何区分这两个不同源之间的动作。当我尝试绑定自定义事件时,场景生成器对我大吼大叫,只允许 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 的正确部分。大多数 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");
}
}
如果您想使用相同的方法处理 MouseEvent
和 ActionEvent
,您可能需要将方法的参数类型更改为 Event
。