Java SWT应用程序 – 带到前面

我目前正在Windows 7上开发一个SWT java应用程序。通常,应用程序将被最小化,并且当串行端口上有事件时,应用程序应该最大化自身。 以下代码执行最大化部分。

private void bringToFront(final Shell shell) { shell.getDisplay().asyncExec(new Runnable() { public void run() { if(!shell.getMaximized()){ shell.setMaximized(true); } shell.forceActive(); } }); } 

但有时SWT应用程序在另一个应用程序后最大化。 例如,如果我在全屏模式下运行powerpoint,则最大化应用程序落后于powerpoint演示。 我想让它最大化并带到所有其他应用程序的前面。

谁能帮我?

您需要在Shell实例上设置样式位SWT.ON_TOP 。 不幸的是,只能在构造函数中设置样式位。

但是,如果我理解您的用例设置可能对您有用,那么您似乎只在最小化和最大化状态之间切换。

如果这不可能,只需处理并重新创建shell及其内容,当您想要在状态之间切换时。

还有一种“hackey”方式可以做到这一点,而不是你发现的,这并不需要你最小化其他一切。 实际上你需要调用shell.setMinimized(false)并在那个shell.setActive()之后恢复shell的先前状态。 但是,只有在shell真正处于最小化状态时才有效。 所以这是我的最终解决方案,如果它没有最小化,人工最小化shell 。 如果必须进行最小化,则成本是快速动画。

 shell.getDisplay().syncExec(new Runnable() { @Override public void run() { if (!shell.getMinimized()) { shell.setMinimized(true); } shell.setMinimized(false); shell.setActive(); } }); 

我发现了一些问题的解决方法,可能不是最好的解决方案但对我有用。 如果有人有更好的解决方案继续发布 谢谢

使用showDesktop()方法首先模拟windows key + D事件来显示桌面

  private void showDesktop() { try{ Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_WINDOWS); robot.keyPress(KeyEvent.VK_D); robot.keyRelease(KeyEvent.VK_D); robot.keyRelease(KeyEvent.VK_WINDOWS); } catch(Exception e){e.printStackTrace();} } 

然后最大化shell应用程序

  private void bringToFront(final Shell shell) { showDesktop(); //minimize all the application Thread.sleep(5000); // here have to wait for some time, I am not sure why shell.getDisplay().asyncExec(new Runnable() { public void run() { if(!shell.getMaximized()){ shell.setMaximized(true); } shell.forceActive(); } }); } 

您需要应用程序以全屏模式工作。

查看此链接如何创建涵盖Windows标题栏的Java Swing应用程序?