JavaFX:右键单击菜单项
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22099723/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JavaFX: Right click on menuitem
提问by Aspirant
I have been wondering that why was JavaFX MenuItems designed to do the designated action on a right click? Usually a menu item in any windows application is supposed to act on a left click of a mouse but in JavaFX it seen that both clicks act equally.
我一直想知道为什么 JavaFX MenuItems 被设计为在右键单击时执行指定的操作?通常,任何 Windows 应用程序中的菜单项都应该在鼠标左键单击时起作用,但在 JavaFX 中,它看到两次单击的作用相同。
On another thought, is there a way to block a right click on MenuItems? I tried the following code, but it fails.
另一方面,有没有办法阻止右键单击 MenuItems?我尝试了以下代码,但失败了。
It looks like the event handler does not get registered at all.
看起来事件处理程序根本没有注册。
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);
}
}
采纳答案by brian
You have lots of extraneous code. I removed some. The way to stop events is in the filtering. You have to find out when an event gets fired, selected seems to happen on pressed and onAction happens on released. The two events together on one node makes a click.
你有很多无关的代码。我删除了一些。停止事件的方法是在过滤中。您必须找出事件何时被触发,selected 似乎在按下时发生,而 onAction 在释放时发生。一个节点上的两个事件一起点击。
No need to add a handler to each menu item, and even then you could just re-use the same one. The parent menus get the onAction event.
无需为每个菜单项添加处理程序,即便如此,您也可以重复使用相同的处理程序。父菜单获取 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);
}
}
回答by Inge
Have you tried to put in
你有没有试过放入
e.consume();