如何在ApplicationWindow对象关闭时最小化应用程序到系统托盘?

时间:2014-05-03 08:23:35

标签: java swt application-close

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

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

  • 设置shell样式:我可以使用ApplicationWindow实例的getShell方法获取shell,我只能操作它根本不显示任何按钮(SWT.TITLE)或所有按钮。没有运气只能使用setShellStyle隐藏X(getShellStyle()& ~SWT.CLOSE);

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

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

2 个答案:

答案 0 :(得分:1)

我所做的是使用隐藏的shell作为主窗口,让应用程序窗口正常关闭。类似的东西:

// 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();
 }

答案 1 :(得分:0)

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

覆盖close方法!

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;