我有三个窗口A、B、C,A中有一个按钮能打开B,B中有一个按钮打开C。B、C都是A的内部类。请问我在A中点击按钮打开B后,再把B窗口关掉,接着再点击按钮打开B,再点击B中的按钮,结果弹出了两个C窗口。怎样才能只弹出一个C呢?一下是我的代码
import javax.swing.*;import java.awt.event.*;public class CloseWindow extends JFrame{
private JButton button=new JButton("show b");

private void setComponent(){
setTitle("a");
button.addActionListener(new Window1()); //注册打开B窗口
add(button);
pack();
setVisible(true);
}

class Window1 extends JFrame implements ActionListener{
private JButton button2=new JButton("show c");
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setTitle("b");
button2.addActionListener(new Window2());//注册打开C窗口
add(button2);
pack();
setVisible(true);
}

}

class Window2 extends JFrame implements ActionListener{
private JLabel label=new JLabel("OK");
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setTitle("c");
add(label);
pack();
setVisible(true);
}

}

public static void main(String[] args){
CloseWindow window=new CloseWindow();
window.setComponent();
}
}

解决方案 »

  1.   

    楼主show “b”窗口时就已经为show “c”按钮添加了监听器,所以楼主关闭“b”窗口在再开在show “c”就显示了两个,如果楼主连续关闭b窗口两次再show “c”你会发现有三个,以此类推会发现更多。
      

  2.   


    public class CloseWindow {
    JFrame jfa = new JFrame("a"), jfb = new JFrame("b"), jfc = new JFrame("c"); JButton jba = new JButton("showB"), jbb = new JButton("showC"); JTextField jtf = new JTextField("OK" ,20); public void init() {
    jfa.add(jba);
    jfb.add(jbb);
    jfc.add(jtf);
    jfa.setVisible(true);
    jfa.pack();
    jfa.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    jba.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
    jfb.setVisible(true);
    jfb.pack();// TODO Auto-generated method stub
    jfb.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
    });
    jbb.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
    jfc.setVisible(true);
    jfc.pack();// TODO Auto-generated method stub
    jfc.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
    });
    }

    public static void main(String...args){
    new CloseWindow().init();
    }
    }
      

  3.   

    除了把两个内部JFrame变成成员变量以外,java没有把窗口完全关闭的方法吗?
      

  4.   

    可以设置关闭窗口模式
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)退出虚拟机,关闭所有窗口。
    不过硬是要使用setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)来关闭一个窗口的话。
    可以使用判断来设置按钮的ActionListener数量。
    if(button2.getActionListeners().length<1){//只让按钮添加一个Listener
    button2.addActionListener(new Window2());
    }// 注册打开C窗口
      

  5.   

    窗口隐藏用XXX.setVisible(false);
    窗口关闭用XXX.dispose();