JavaFX:右键单击菜单项



我一直在想,为什么JavaFX MenuItems被设计为在右键单击时执行指定的操作?通常,任何windows应用程序中的菜单项都应该作用于鼠标的左键单击,但在JavaFX中,可以看到两次单击的作用相同。

另一方面,有没有办法阻止右键单击MenuItems?我尝试了以下代码,但失败了。

看起来事件处理程序根本没有注册。

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class ContextMenuDemo extends Application
{
@Override
public void start(Stage primaryStage)
{
final ContextMenu cm = new ContextMenu();

MenuItem menuItem1 = getMenuItemForLine("line 1");
MenuItem menuItem2 = getMenuItemForLine("line 2");
MenuItem menuItem3 = getMenuItemForLine("line 3");
menuItem1.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent e)
{
if (e.getButton() == MouseButton.SECONDARY)
{
System.out.println("Desired Click");
}
else
{
System.out.println("No right click");
}
e.consume();
}
});
menuItem2.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent e)
{
if (e.getButton() == MouseButton.SECONDARY)
{
System.out.println("Desired Click");
}
else
{
System.out.println("No right click");
}
e.consume();
}
});
menuItem3.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent e)
{
if (e.getButton() == MouseButton.SECONDARY)
{
System.out.println("Desired Click");
}
else
{
System.out.println("No right click");
}
e.consume();
}
});

cm.getItems().add(menuItem1);
cm.getItems().add(menuItem2);
cm.getItems().add(menuItem3);
final Rectangle rectangle = new Rectangle(70, 70, Color.TAN);
rectangle.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent e)
{
if (e.getButton() == MouseButton.SECONDARY)
{
cm.show(rectangle, e.getScreenX(), e.getScreenY());
}
else
{
System.out.println("No right click");
}
}
});
Group root = new Group();
root.getChildren().addAll(rectangle);
Scene scene = new Scene(root, 350, 250);
primaryStage.setScene(scene);
primaryStage.show();
}
private MenuItem getMenuItemForLine(String menuName)
{
Label menuLabel = new Label(menuName);
MenuItem menuItem = new MenuItem();
menuItem.setGraphic(menuLabel);
return menuItem;
}
public static void main(String[] args)
{
launch(args);
}
}

您有很多无关的代码。我去掉了一些。停止事件的方法是在筛选中。你必须找出事件何时被触发,按下时选择似乎发生,释放时onAction发生。两个事件在一个节点上一起单击。

不需要为每个菜单项添加一个处理程序,即使这样,您也可以重复使用同一个。父菜单获取onAction事件。

package contextmenudemo;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class ContextMenuDemo extends Application {
@Override
public void start(Stage primaryStage) {
final ContextMenu cm = new ContextMenu();
cm.addEventFilter(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if (event.getButton() == MouseButton.SECONDARY) {
System.out.println("consuming right release button in cm filter");
event.consume();
}
}
});
cm.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("right gets consumed so this must be left on "+
((MenuItem)event.getTarget()).getText());
}
});
MenuItem menuItem1 = new MenuItem("line 1");
MenuItem menuItem2 = new MenuItem("line 2");
MenuItem menuItem3 = new MenuItem("line 3");
cm.getItems().addAll(menuItem1, menuItem2, menuItem3);
final Rectangle rectangle = new Rectangle(70, 70, Color.TAN);
rectangle.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
if (e.getButton() == MouseButton.SECONDARY) {
cm.show(rectangle, e.getScreenX(), e.getScreenY());
} else {
System.out.println("No right click");
}
}
});
Group root = new Group();
root.getChildren().addAll(rectangle);
Scene scene = new Scene(root, 350, 250);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}

你试过放入吗

e.consume();

最新更新