【问题标题】:Java SWT application - Bring To FrontJava SWT 应用程序 - 放在前面
【发布时间】:2015-08-25 18:39:37
【问题描述】:

我目前正在 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 演示文稿的后面。我想让它最大化并放在所有其他应用程序的前面。

谁能帮帮我?

【问题讨论】:

  • 不。 forceActive 方法将外壳移动到 Z 顺序的顶部。当且仅当没有其他窗口也将自身移动到 Z 顺序的顶部时,这会将 shell 带到前面。

标签: java swt


【解决方案1】:

除了您发现的方法之外,还有另一种“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();
    }
});

【讨论】:

    【解决方案2】:

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

    但是,如果我了解您的用例设置,该位可能对您来说是可行的,因为您似乎只能在最小化和最大化状态之间切换。

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

    【讨论】:

      【解决方案3】:

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

      使用方法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();
               }
          });
        }
      

      【讨论】:

        【解决方案4】:

        您需要您的应用程序在全屏模式下工作。

        看看这个链接 How can I create a Java Swing app that covers the Windows Title bar?

        【讨论】:

        • 好的,我使用的不是 SWING 库,而是 SWT。我在 SWT 上尝试了类似的选项,但它不符合我的期望。最大化时的 java 应用程序仍然落后于 power point 应用程序。
        猜你喜欢
        • 2011-01-19
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多