Java SWT 应用程序 - 置顶窗口

9

我正在开发一款SWT Java应用程序,在Windows 7上运行。通常情况下,应用程序会最小化,当串口上发生事件时,应用程序应该自动最大化。以下代码实现了最大化的部分。

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 演示文稿掩盖。我希望它可以最大化并置于所有其他应用程序之上。请问有人能帮忙吗?

不是的。forceActive 方法会将窗口移动到 Z 顺序的顶部。只有当没有其他窗口也正在将自己移到 Z 顺序的顶部时,这将把窗口带到前面。 - Gilbert Le Blanc
4个回答

9

有一种比你找到的方法更加“巧妙”的方式来完成这个操作,不需要你最小化其他所有东西。你实际上需要调用 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();
    }
});

5
你需要在你的Shell实例上设置样式位SWT.ON_TOP。不幸的是,只有在构造函数中才能设置样式位。
但如果我理解你的用例,设置这个位可能对你可行,因为你似乎只是在最小化和最大化状态之间切换。
如果不行,当你想要在状态之间切换时,只需处理并重新创建你的shell及其内容即可。

4

我找到了一些解决该问题的方法,可能不是最佳解决方案,但对我有用。如果有更好的解决方案,请保持更新。谢谢。

使用方法showDesktop()首先模拟Windows键+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();
         }
    });
  }

-2

1
好的,我没有使用SWING库而是使用SWT。我尝试了SWT上的类似选项,但它并不符合我的期望。当Java应用程序最大化时,它仍然在PowerPoint应用程序后面。 - Dinesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接