Java SWT应用程序-放在前面

Java SWT应用程序-放在前面,java,swt,Java,Swt,我目前正在Windows7上开发一个SWTJava应用程序。通常,应用程序将最小化,当串行端口上发生事件时,应用程序应将自身最大化。下面的代码执行最大化部分 private void bringToFront(final Shell shell) { shell.getDisplay().asyncExec(new Runnable() { public void run() { if(!shell.getMaximized()){

我目前正在Windows7上开发一个SWTJava应用程序。通常,应用程序将最小化,当串行端口上发生事件时,应用程序应将自身最大化。下面的代码执行最大化部分

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。不幸的是,设置样式位只能在构造函数中进行

但若我理解您的用例设置,那个么这一点对您来说可能是可行的,因为您似乎只在最小化和最大化状态之间切换


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

我找到了一些解决问题的方法,可能不是最好的解决方案,但对我来说很有效。如果有更好的解决方案,请随时发布。谢谢

使用方法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();
         }
    });
  }
有另一种“黑客”方式可以做到这一点,而不是你所发现的,它不需要你最小化其他一切。实际上,您需要调用
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();
    }
});

不。forceActive方法将壳移动到Z顺序的顶部。当且仅当没有其他窗口也将其自身移动到Z顺序的顶部时,这将使外壳向前移动。好的,我使用的不是SWING库,而是SWT。我在SWT上尝试了类似的选项,但它并没有达到我的预期。java应用程序在最大化时仍然落后于power point应用程序。