2010-02-19 142 views
1

说如果我有两个类,在每个类中是不同的JFrame,例如JFrame A和JFrame B(在单独的类中)。JFrame关闭问题

现在来自JFrame A的构造函数,我可能会推一个带有一个actionlistener的按钮,它将实例化另一个类,从而创建JFrame B.问题是当创建JFrame B时,两个JFrame都可见。如果我关闭JFrame B,那么JFrame A也会关闭。我如何使它只有JFrame B关闭?

感谢

编辑DISPOSE_ON_CLOSE没有工作对我来说,它会关闭所有的jframes。

一些示例代码:

public class classone { 
    public classone() { 
    JFrame a = new JFrame("this is A"); 
    classtwo newFrame = new classtwo(); 
    } 
} 

public class classtwo { 
    public classtwo() { 
    Jframe b = new JFrame("this is B"); 
    b.setDefaultCloseOperation(b.DISPOSE_ON_EXIT); 
    } 
} 

请忽略任何语法错误,只是为了演示。

+1

因为你的意思是不正确的,这是不可能回答你的问题。也许您可以向我们展示一个小代码示例,说明您描述的行为,并且我们可以帮助您找到问题所在? – 2010-02-19 15:50:09

+1

你确定你正在关闭JFrame B而不是JFrame A吗? – Fernando 2010-02-19 15:57:53

+0

如果您发布的示例提取实际上是代码,那么newFrame将立即被垃圾收集,因为它在classone构造器中被创建为局部变量。我也看不到任何对setVisible()的调用。 – Adamski 2010-02-19 16:22:29

回答

2

对JFrame B,设置默认关闭操作为“处置”,如下图所示:

frameB.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

然后关闭子窗口不会关闭整个应用程序。

HTH! ;-)

+0

你好,我试过了,它似乎仍然关闭所有的jframes! – KP65 2010-02-19 15:53:34

+1

@Keval:如果你可以在这里发布代码的相关部分,这将是很好的。 – missingfaktor 2010-02-19 15:56:05

+0

现在发布了一个例子,谢谢 – KP65 2010-02-19 16:00:42

1

你在一帧有DISPOSE_ON_CLOSE而在另一帧有EXIT_ON_CLOSE吗?如果是这样,那就可以解释为什么你的程序过早退出。确保所有帧都设置为DISPOSE_ON_CLOSE

0

只需在WindowClosing方法中DO_NOTHING_ON_CLOSE和addWindowListener显示一个JOptionPane.showConfirmDia,如果结果返回no(1),则返回; else system.exit(0); 其全部

我看到我的第一个StackOverFlow帖子,真是太遗憾了!我在编辑我的帖子。

到现在为止,我意识到依靠开发软件方法Swing变得越来越老。我错过了像Microsofts XAML这样的技术。

soyatec inc。具有使用XAML与Java中,你可以看看,但“在我看来,”一些交易不是全成work.Anyway ...

JFrame frame=new JFrame(); 
    frame.addWindowListener(new WindowListener() { 

     @Override 
     public void windowClosing(WindowEvent e) { 
      int result= JOptionPane.showConfirmDialog(JOptionPane.getRootFrame() //or your parent swing element 
        , "Sure ?"); 
      switch (result) { 
      case 1: 

       break; 
      default: 
       System.exit(0); 
       break; 
      } 
     } 

     @Override 
     public void windowActivated(WindowEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void windowClosed(WindowEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void windowDeactivated(WindowEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void windowDeiconified(WindowEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void windowIconified(WindowEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void windowOpened(WindowEvent e) { 
      // TODO Auto-generated method stub 

     } 
    } 
      ); 
0

我得到了现在的问题。只是当你创建一个窗口的实例,告诉这个对象如何生活,查看此代码

... 
     new JFrame(){ 
      @Override 
      public synchronized void addWindowListener(WindowListener l) { 
       // You may ask here also add windowClosing method and look at my previous post 
       super.addWindowListener(l); 
      } 
     }.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
.... 
+0

这是我在stackoverflow上的第一篇文章,其实我并不明白你的意思。你的意思是内存管理吗?我在.net proj上。开发。现在我不知道,但正如我记得Do_NOTHING_ON_CLOSE什么都不做(但你可以通过addWindowListener实现它)但是,正如我看到你使用EXIT_ON_CLOSE它会最终确定你的app.I认为dispose_on_close销毁你的对象它的内存管理的好处。也可以使用HIDE_ON_CLOSE,因为您知道您的意图是否暂时隐藏它。随你便。这取决于你的意图。 – 2012-03-13 14:04:24