在没有静态变量的情况下更改另一个类中的变量?

时间:2013-03-29 05:00:00

标签: java getter-setter static-variables

在我正在编写的程序中,我有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;
}

3 个答案:

答案 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...
}