2011-10-14 36 views
0

我有,我想从一个JButton也进一步关闭比窗口上的标准的X按钮windowbuilderpro开发的一类,所以这里的类的实例:从一个JButton过程中关闭的JFrame仍然活着,

public class MainWindow { 

public JFrame frame; 

public MainWindow() { 
    initialize(); 
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    } 

public void show() { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       //Show the main Frame 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

当我从X按钮关闭窗口时,窗口正确关闭,进程终止。

当我关闭,而不是从一个JButton有这个监听器:

mntmExit.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       //Close the application main form 
       frame.setVisible(false); 
       frame.dispose(); 
      } 
     }); 

框架窗口接近正常,但该过程仍然活着,为什么?

Process Alive

正如你可以看到有开始和持续终止AWT-关闭线程,我怎么能做到这一点还关闭应用程序的X按钮相同的行为呢?

注:

System.exit(0);是不适合的,因为它也终止了应用程序,如果有另一个后台运行线程,我不想这样做。 MainWindow类应该关闭并释放它的资源,这与使用关闭MainWindow实例的X按钮关闭应用程序的行为相同,但如果有后台线程正在运行,它不会杀死它们,而是等待它们完成工作。

环境:

  • JDK 7
  • 的Eclipse 3.7.1
+0

是我应该befo说回复: - 为了更快地获得更好的帮助,请发布[SSCCE](http://pscode.org/sscce.html)。在SSCCE中,一个松散的计时器会很明显。而且由于我提到的是代码,你可以选择缩进代码的逻辑样式之一,并坚持以后的帖子?我花了很长时间重新格式化并理解了代码,而不是将代码转换为工作代码。 –

回答

2

不知道你真正需要的东西,看起来像您再次再次创造新的JFrame,不这样做,一旦创建的JFrame并重新使用该集装箱

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // do nothing 

frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); // same as setVisible(false) 

然后visibily你只能调用frame.setVisible(true);

更多的部分舒适是覆盖WindowListener,那么你就可以控制一些活动

+0

我只创建了一次框架实例,为什么如果我用窗口标题上的X按钮关闭窗体我得到正确的行为,而是如果我关闭框架调用处置我得到我不同的行为? – aleroot

+0

implements WindowListener创建一个void从JButton与WindowListener共享Action,hmmm使用JPopumMenu实现SystemTry,使用JFrame添加JMenuItem#setVisible(true); – mKorbel

-1

只需添加一行:

System.exit(0); 
+0

Syste.exit(0);如果在另一个线程中有一个正在运行的后台进程并且终止了我的后台线程,请关闭该应用程序!我不想那么做! – aleroot

+0

-1这是错误的答案。 –

+0

当我回答这个问题时,aleroot没有谈论后台进程,并且在我回答后编辑了他的问题。 – Balconsky

2

x按钮或Exit按钮被激活时,此代码中的所有线程均会停止。你有不同的行为吗?

import java.awt.event.*; 
import javax.swing.*; 

public class MainWindow { 

    public JFrame frame; 
    JButton mntmExit = new JButton("Exit"); 

    public MainWindow() { 
     frame = new JFrame("Close Me!"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     mntmExit.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       //Close the application main form 
       frame.setVisible(false); 
       frame.dispose(); 
      } 
     }); 
     frame.add(mntmExit); 
     frame.pack(); 
     show(); 
    } 

    public void show() { 
     //Show the main Frame 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       MainWindow mw = new MainWindow(); 
       mw.show(); 
      } 
     }); 
    } 
} 
+0

是的,当我尝试关闭退出按钮的框架线程保持活着,你可以看到在屏幕截图图像,而不是如果我关闭窗口的X按钮窗口应用程序关闭正确,因为没有其他线程处于活动状态。我想用我创建的关闭按钮实现相同的行为...我使用的是JDK 7。 – aleroot

+0

在JDK 6中试用它。如果它在Java 7中显示不同的行为(可能还有很多错误),那么它可能是一个..bug。 –

+1

刚刚运行这个程序与构建1.7.0-b147和构建1.6.0_25-b06,都在x64上,他们很好地关闭。只是觉得我会提出一些支持,可能是版本问题。 – pimaster

相关问题