我正在编译一个开源备份应用程序。我希望不使用X关闭应用程序,也不希望在Windows中使用任何组合键,例如Alt + F4。在这种情况下,我更喜欢将应用程序最小化到系统托盘中。
我是Java的新手,到目前为止我所尝试的是:
设置shell样式:我可以使用ApplicationWindow实例的getShell方法获取shell,我只能操作它根本不显示任何按钮(SWT.TITLE)或所有按钮。没有运气只能使用setShellStyle隐藏X(getShellStyle()& ~SWT.CLOSE);
使用(getFrames)方法获取JFrame列表,并尝试在0处操作该项。但是我找不到该对象的setDefaultCloseOperation方法,这似乎解决了我对托盘问题的最小化问题。
没有运气从ApplicationWindow获取JFrame实例,所以我无法使用setDefaultCloseOperation方法。
答案 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;