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

Java 如何在关闭ApplicationWindow对象时最小化应用程序到系统托盘?,java,swt,application-close,Java,Swt,Application Close,我正在编译一个开源备份应用程序。我希望应用程序不要使用X或任何组合键(如Windows中的Alt+F4)关闭。在这种情况下,我更喜欢将应用程序最小化到系统托盘 我是Java新手,目前为止我尝试的是: 设置shell样式:我可以使用ApplicationWindow实例的getShell方法获取shell,我只能对其进行操作以完全不显示按钮(SWT.TITLE)或显示所有按钮。仅使用setShellStyle(getShellStyle()&~SWT.CLOSE)隐藏X不会带来好运 使用(get

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

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

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

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

  • 也没有从ApplicationWindow获得JFrame实例,因此我无法使用setDefaultCloseOperation方法


我要做的是使用一个隐藏的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();
 }

以下是我在两天的研究后如何解决这个问题的:

覆盖关闭方法

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;

是的,除了框架,我不知道Swing是什么,我相信这个方法会返回一个Frame对象。因为SWT使用本地控件,所以Swing代码提供给您的任何东西都是无关的。谢谢,但是如果不从头开始开发代码,这个方法似乎是不可能的。我从你的灵感中找到了另一种方式,我会马上与你分享。