大概说下我遇到的情况:
设计了两个窗口A和B,每个窗口上分别有有一个按钮。对每一个按钮进行监听。
程序运行后,先打开一个窗口A,然后通过点击这个窗口上的按钮实现:打开另一个窗 口B,同时利用Dispose()关闭当前窗口。
就这样两个窗口之间互相调用两三次后,出现了点击A上的按钮,一下子出现多个B窗口,然后继续点击,窗口越来越多。
通过不断的调试,最后终于发现了出现这个问题的原因。下面通过代码显示两个窗口之间的关系。
public class B_1 {
JFrame frameA;
JButton buttonA=new JButton("A");
public void Wo() {
frameA =new JFrame();
frameA.add(buttonA);
buttonA.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//点击按钮A,关闭窗口A,打开窗口B
}
});
}
JFrame frameB;
JButton buttonB=new JButton("B");
public void B() {
frameB=new JFrame();
frameB.add(buttonB);
buttonB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//点击按钮B,关闭创口B,打开窗口A
}
});
}
}
原来原因是JFrame的实例化在方法体中进行,如果把JFrame的生命和实例化同时进行,且放在方法体之外,窗口便不会重复出现了
但这时又出现了按钮消失不见的bug,通过调试,发现应该将按钮实例化放在方法体中,否则多次调用后系统会找不到按钮在哪。
最后,。问题解决后的代码如下:
public class B_1 {
JFrame frameA =new JFrame();
JButton buttonA;
public void Wo() {
buttonA=new JButton("点击");
frameA.add(buttonA);
buttonA.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//点击按钮A,关闭窗口A,打开窗口B
}
});
}
JFrame frameB=new JFrame();
JButton buttonB;
public void B() {
buttonB=new JButton();
frameB.add(buttonB);
buttonB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//点击按钮B,关闭创口B,打开窗口A
}
});
}
}