0

在我目前正在编写的程序中,我有 2 个 JFrame(每个在不同的类中,每个都有不同的用途,但是您可以将小部件框架视为某种奴隶),一个是主窗口,另一个是在主窗口中点击按钮时弹出的“小部件”。我只想一次打开一个小部件的副本。我目前正在通过 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 布尔值应该为假,并允许我打开另一个窗口,但是在取消按钮操作侦听器中,我的变量没有改变。那么,我是否以正确的方式解决我的问题而不使 openWidget 成为静态变量?(我应该使用 getter 和 setter 对吗?)我做错了什么,我对实例化 main 的新实例有什么不理解每次单击该按钮时都会出现窗口?

此外,我的 getter 和 setter 标准如下。

void setOpenWidget(boolean val){
    this.openWidget = val;
}

boolean getOpenWidget(){
    return this.openWidget;
}
4

3 回答 3

0

您正在调用setOpenWidget(false)使用此行创建的其他一些新实例MainWindow ui = new MainWindow();

您应该setOpenWidget(false)使用初始化小部件的同一实例进行调用。在创建小部件时将 MainWindow 的引用传递给小部件并setOpenWidget(false)使用该引用进行调用

于 2013-03-29T05:08:49.620 回答
0

当你创建 inside 的对象时,widgetMainWindow可以这样调用它:

widget = new Widget(this);

并按如下方式更改 Widget Window Constructor:

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...
}
于 2013-03-29T05:10:39.617 回答
0

只需将 MainWindow 的引用传递给 Widget 类,以便它可以在取消按钮上更新其标志。

于 2013-03-29T05:03:16.117 回答