假如我有几个窗体,都是继承JFrame,我要在A窗体界面中用按钮事件触发使B窗体弹出来,即new 一个B窗体,但是当我不停的点击按钮时就会弹出好多同样的B窗体,我希望每一次点击按钮时,把上一次的B窗体关闭,重新显示。我原来的代码如下 B b;
        if(b==null)//判断b为null时创建一个新的
             b= new B();

        else          
{
    b= null; //当b不为null,即窗体已经弹出,把它置为null,但是怎样才能把原来的b关闭,重新刷屏显示新的b?
    b= new B(); //新建一个B对象
    
}不知道我这种思路是否好,或者大家有什么好的方法也可以分享一下

解决方案 »

  1.   


         B b;
         if(b==null)//判断b为null时创建一个新的
               b= new B();
        
          else          
          {
            b= null; //当b不为null,即窗体已经弹出,把它置为null,但是怎样才能把原来的b关闭,重新刷屏显示新的b?
            b= new B(); //新建一个B对象
                                
           }
      

  2.   

    这个样子
    if(b.isVisible()){
    b.dispose();
    }
    b=new B();
    b.setVisible(true);
      

  3.   

    package test;import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JButton;
    import javax.swing.JFrame;public class FrameTest { private boolean visible = false; public FrameTest() {
    JFrame f = new JFrame(); final JFrame hideFrame = new JFrame("Hide");
    hideFrame.setBounds(200, 200, 300, 300);
    final JButton button = new JButton("Show");
    button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    visible = !visible;
    button.setText(visible ? "Hide" : "Show");
    hideFrame.setVisible(visible);
    }
    }); f.setSize(300, 150);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.getContentPane().add(button, BorderLayout.SOUTH);
    // f.pack();
    f.setVisible(true);
    } public static void main(String args[]) {
    new FrameTest();
    }
    }
    并不需要每一次重新构建,因为这样的话速度比较慢,效率很差。通常这样的方式不会采用。当然,不排除特殊情况。
    你看一下以上代码,希望对你有所帮助。
      

  4.   

    如果你的关闭里定义了.dispose 那b将被清空 b==null 来判断是否关闭
    if(b==null){ 
    b.dispose(); 

    b=new B(); 
    b.setVisible(true);否则通过判断B是否显示执行
    if(b.isVisible()){ 
    b.dispose();//销毁B,释放资源,清空b 
    b=new B(); 
    }
    //因为b未被清空可以不用创建B,显示出来就好了 
    b.setVisible(true);
      

  5.   

    因为我每一次点击按钮时都要弹出b窗口,且b窗口的内容可能会不同,setVisible();会出现点击一次弹出,第二次就没有弹出,到第三次才弹出了。
      

  6.   


    呵呵,请问所谓隐藏和关闭的区别何在?我不认为只有这个窗口被销毁了才是关闭。例如一个模态对话框,只要调用了setVisible(false);那么这个模态窗口将不可见,并解除其所引起的阻塞。那么这个窗口这个时候是否算是关闭呢?至于说节约开销的原因其实也并不是因为没有初始化,如果需要,完全可以将构造函数中的内容抽出来单独组织一个函数,根据需要来决定每次显示的时候所需要显示的状态,例如每一次将各个输入框的内容都清空等。LZ的代码没有使代码可复用。因为每次重新构造的话都要向系统重新申请资源。当然,其优点是节约了空间。而我则没有释放资源,采用的是“空间换时间”的方式。但无法显示的都是同一个B 
    这一句话,没有看明白~~4楼的兄弟,或者姐妹,能不能再说说,交流一下,共同进步
    ~~谢谢你~~当然,其实这个问题本身并不复杂,但是却能带来很多思考~~LZ想要的效果其关键在于需要记录一个状态,表示B窗口显示或关闭。做法不唯一,我的一点代码无非是抛砖引玉,希望看到大家的解决方式,共同交流。
      

  7.   

    9楼的兄弟可能理解错了,我是希望每一次点击按钮时都要弹出b窗口,而b窗口的内容可能会不同,用setVisible()来做会出现点击一次弹出,第二次就没有弹出,到第三次才弹出了的现象,不过从你的代码里还是学习到了,希望多多交流。