0

我正在编译一个开源备份应用程序。我希望应用程序不要使用 X 或任何组合键(例如 Windows 中的 Alt+F4)关闭。在这种情况下,我更喜欢将应用程序最小化到系统托盘。

我是 Java 新手,到目前为止我尝试过的是:

  • 设置外壳样式:我可以使用 ApplicationWindow 实例的 getShell 方法获取外壳,我只能对其进行操作以完全不显示按钮(SWT.TITLE)或所有按钮。没有运气,只能使用 setShellStyle(getShellStyle() & ~SWT.CLOSE); 隐藏 X

  • 使用 (getFrames) 方法获取 JFrame 列表,并尝试在 0 处操作项目。但是我找不到对象的 setDefaultCloseOperation 方法,这似乎解决了我的最小化到托盘问题。

  • 从 ApplicationWindow 获取 JFrame 实例也没有运气,所以我不能使用 setDefaultCloseOperation 方法。

4

2 回答 2

1

我所做的是使用隐藏的外壳作为主窗口,让应用程序窗口正常关闭。就像是:

// Main shell

Shell shell = new Shell(display, SWT.NO_TRIM);

shell.setBounds(0, 0, 0, 0);

shell.open();

shell.setVisible(false);

// Add system tray

Tray tray = display.getSystemTray();

TrayItem item = new TrayItem(tray, SWT.NONE);

item.setImage(image);

// System tray menu

final Menu menu = new Menu(shell, SWT.POP_UP);

MenuItem exitItem = new MenuItem(menu, SWT.PUSH);
exitItem.setText("Exit");

exitItem.addSelectionListener(new ExitListener());

item.addMenuDetectListener(new MenuDetectListener()
  {
    @Override
    public void menuDetected(MenuDetectEvent e)
    {
      menu.setVisible(true);
    }
  });

// Main loop

while (!shell.isDisposed())
 {
   if (!display.readAndDispatch())
     display.sleep();
 }
于 2014-05-03T09:14:24.887 回答
0

以下是我经过 2 天的研究后解决问题的方法:

覆盖关闭方法!

public boolean close() {

    final Shell grandShell = this.getShell();
    grandShell.setVisible(false);

    Display display = Display.getCurrent();

    Tray tray = display.getSystemTray();
    if(tray != null) {
        TrayItem item = new TrayItem(tray, SWT.NONE);
        item.setImage(ArecaImages.ICO_SMALL);
        final Menu menu = new Menu(getShell(), SWT.POP_UP);
        MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
        menuItem.setText("Areca");
        menuItem.addListener (SWT.Selection, new Listener () {
            public void handleEvent (Event event) {
                grandShell.setVisible(true);
            }
        });
        item.addListener (SWT.MenuDetect, new Listener () {
            public void handleEvent (Event event) {
                menu.setVisible (true);
            }
        });

    }

    return true;
于 2014-05-03T10:21:48.333 回答