2012-03-15 37 views
6

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

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演示文稿的后面。我希望能够最大限度地发挥它的作用,并将其应用于所有其他应用程序之前。

任何人都可以帮助我吗?

+0

没有。 forceActive方法将外壳移动到Z顺序的顶部。当且仅当没有其他窗口也移动到Z顺序的顶部时,这会将外壳带到前面。 – 2012-03-15 15:47:21

回答

5

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

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

如果这是不可能的,只需处理并重新创建你的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();} 
    } 

然后最大化壳应用

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(); 
     } 
    }); 
    } 
5

有一个又一个 “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(); 
    } 
});