Canvas 上的弹出菜单:仅在特定边界内显示
Pop up menu on Canvas: only display within specific boundary
我在 Canvas
上显示 Image
。当用户右键单击 canvas 时,会显示上下文菜单。
如何仅在用户在图像范围内单击时才显示菜单?我可以从事件中获得 x
和 y
位置,但到那时肯定为时已晚!
final Menu pixelContextMenu = new Menu(canvas);
canvas.setMenu(pixelContextMenu);
final MenuItem resetImageItem = new MenuItem(pixelContextMenu, SWT.NONE);
resetImageItem.setText("Reset Image");
resetImageItem.addListener(SWT.MenuDetect, new Listener() {
@Override
public void handleEvent(Event event) {
int x = event.x;
int y = event.y;
}
});
使用 Event#doit
并将其设置为 false
如果事件在您所在的区域之外。这是一个示例,它将在 Canvas
:
的左半部分显示菜单,但不显示右半部分
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Whosebug");
shell.setLayout(new FillLayout());
final Canvas canvas = new Canvas(shell, SWT.NONE);
Menu menu = new Menu(canvas);
new MenuItem(menu, SWT.NONE).setText("MenuItem");
canvas.setMenu(menu);
canvas.addListener(SWT.MenuDetect, new Listener()
{
@Override
public void handleEvent(Event event)
{
Point location = canvas.toControl(event.x, event.y);
if(location.x > canvas.getBounds().width / 2f)
event.doit = false;
}
});
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
如果您想在任何情况下都显示 Menu
,但根据事件位置禁用某些菜单项,请执行以下操作:
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Whosebug");
shell.setLayout(new FillLayout());
final Canvas canvas = new Canvas(shell, SWT.NONE);
Menu menu = new Menu(canvas);
final MenuItem item = new MenuItem(menu, SWT.NONE);
item.setText("MenuItem");
canvas.setMenu(menu);
canvas.addListener(SWT.MenuDetect, new Listener()
{
@Override
public void handleEvent(Event event)
{
Point location = canvas.toControl(event.x, event.y);
item.setEnabled(location.x <= canvas.getBounds().width / 2f);
}
});
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
我在 Canvas
上显示 Image
。当用户右键单击 canvas 时,会显示上下文菜单。
如何仅在用户在图像范围内单击时才显示菜单?我可以从事件中获得 x
和 y
位置,但到那时肯定为时已晚!
final Menu pixelContextMenu = new Menu(canvas);
canvas.setMenu(pixelContextMenu);
final MenuItem resetImageItem = new MenuItem(pixelContextMenu, SWT.NONE);
resetImageItem.setText("Reset Image");
resetImageItem.addListener(SWT.MenuDetect, new Listener() {
@Override
public void handleEvent(Event event) {
int x = event.x;
int y = event.y;
}
});
使用 Event#doit
并将其设置为 false
如果事件在您所在的区域之外。这是一个示例,它将在 Canvas
:
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Whosebug");
shell.setLayout(new FillLayout());
final Canvas canvas = new Canvas(shell, SWT.NONE);
Menu menu = new Menu(canvas);
new MenuItem(menu, SWT.NONE).setText("MenuItem");
canvas.setMenu(menu);
canvas.addListener(SWT.MenuDetect, new Listener()
{
@Override
public void handleEvent(Event event)
{
Point location = canvas.toControl(event.x, event.y);
if(location.x > canvas.getBounds().width / 2f)
event.doit = false;
}
});
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
如果您想在任何情况下都显示 Menu
,但根据事件位置禁用某些菜单项,请执行以下操作:
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Whosebug");
shell.setLayout(new FillLayout());
final Canvas canvas = new Canvas(shell, SWT.NONE);
Menu menu = new Menu(canvas);
final MenuItem item = new MenuItem(menu, SWT.NONE);
item.setText("MenuItem");
canvas.setMenu(menu);
canvas.addListener(SWT.MenuDetect, new Listener()
{
@Override
public void handleEvent(Event event)
{
Point location = canvas.toControl(event.x, event.y);
item.setEnabled(location.x <= canvas.getBounds().width / 2f);
}
});
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}