在我正在编写的程序中,我有2个JFrame(每个都在不同的类中,每个都有不同的目的,但你可以认为widget框架是某种类型的奴隶),一个是主窗口,另一个是在按下主窗口中的按钮时弹出的“小部件”。 我只希望一次打开一个小部件的副本。我目前通过actionPerformed动作侦听器下的布尔变量来执行此操作。下面是主窗口的动作监听器。
public void actionPerformed(ActionEvent e) {
if(getOpenWidget() == false){
System.out.println(getOpenWidget()); //test line
widget.initialize(); // please note that the instance "widget" is declared just after "public class MainWindow{" :)
widget.frame.setVisible(true);
setOpenWidget(true);
System.out.println(getOpenWidget() ); // test line
}else{
System.out.println(getOpenWidget());
JOptionPane.showMessageDialog(frame, "There is already an instance of the Booking Widget open.");
}
}
现在预订小部件已打开,在预订小部件上有一个取消按钮。下面是小部件的“取消”按钮的动作监听器。
btnCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
MainWindow ui = new MainWindow();
frame.dispose();
ui.setOpenWidget(false);
}
}
现在,再次按下主窗口中的按钮,理论上,openWidget bool应该是false,并允许我打开另一个窗口,但是在取消按钮动作监听器中,我的变量没有改变。那么,我是否以正确的方式解决我的问题而不使openWidget成为静态变量?(我应该使用getter和setter吗?) 每次点击该按钮时,我做错了什么以及我不了解实例化主窗口的新实例?
另外,我的吸气剂和制定者的库存标准如下。
void setOpenWidget(boolean val){
this.openWidget = val;
}
boolean getOpenWidget(){
return this.openWidget;
}
答案 0 :(得分:0)
只需将MainWindow的引用传递给Widget类,以便它可以在取消按钮上更新其标志。
答案 1 :(得分:0)
您正在使用此行setOpenWidget(false)
MainWindow ui = new MainWindow();
您应该使用已初始化窗口小部件的相同实例调用setOpenWidget(false)
。在创建窗口小部件时将MainWindow的引用传递给窗口小部件,并使用该引用调用setOpenWidget(false)
答案 2 :(得分:0)
当您在widget
内创建MainWindow
的对象时,可以这样称呼它:
widget = new Widget(this);
按如下所示更改Widget窗口构造函数:
MainWindow ui;
public Widget(MainWindow mw)
{
this.ui = mw;
//...initialize btnCancel...
btnCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
frame.dispose();
ui.setOpenWidget(false);
}
});
//..do all other stuffs here...
}