【问题标题】:How to minimize the application to system tray on close from ApplicationWindow object?如何在从 ApplicationWindow 对象关闭时将应用程序最小化到系统托盘?
【发布时间】:2014-05-03 08:23:34
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 是的,我不知道 Swing 除了框架之外是什么,而且我相信该方法确实返回了一个 Frame 对象。
  • 由于 SWT 使用原生控件来控制 Swing 代码给你的任何东西都是无关紧要的

标签: java swt application-close


【解决方案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();
 }

【讨论】:

  • 谢谢,但是如果不从头开始开发代码,这种方法似乎是不可能的。我发现了另一种受你启发的方法,我会马上分享。
【解决方案2】:

经过 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-29
    • 2015-01-31
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2017-11-15
    • 2010-11-20
    相关资源
    最近更新 更多