Java Swing:如何从第一帧访问第二帧中的变量?

时间:2010-07-07 20:39:51

标签: java swing netbeans jframe

我正在使用 NetBeans Java 中编写桌面应用程序。

我的问题是:

1st:我有一个Jframe,它是应用程序的主要框架。

第二:在某些时刻我想创建一个新的对象,所以我按addButton y创建一个新的JFrame(我创建一个扩展Jframe的新类窗口),其中包含一些文本字段。

private void addButtonMouseClicked(java.awt.event.MouseEvent evt) {
    w = new window();
    w.setVisible(true);
}

这是使用简单字符串而不是完整类简化的屏幕截图 http://img820.imageshack.us/img820/3361/screenshotlw.png

第3名:在这个新窗口中,当我按下某个按钮时,我读取了文本字段并创建了对象。

最后,当我按下接受按钮时,我想让新帧在第二帧中获取对象。

问题:从第一帧中获取对象的最优雅/高效/简单/更好的方法是什么?

我的第一个解决方案:是在第一个窗口创建静态方法setNewData(),第二个窗口在您按下按钮时调用此方法。

现在我来了新解决方案: 在第二帧我有一个方法来在按钮上设置mouselistener。还有一个getString()函数。

在第一帧我得到了这个:

private void addButtonMouseClicked(java.awt.event.MouseEvent evt) {
    w = new window();
    w.setHandler(ml);
    w.setVisible(true);
}

MouseListener ml = new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        TextFieldOn1stFrame.setText(w.getString());
    }
};

在第二帧我得到了这个

public void setHandler(MouseListener ml){
    button1.addMouseListener(ml);
}

public String getString(){
    return texto.getText();
}

注意:对于Long Text,对不起,我是java的新手,不知道这个解决方案是否是最好的。 顺便说一下我的英语也不好意思。

3 个答案:

答案 0 :(得分:2)

我不知道这是否是Swing标准的处理方式,但是当子窗口执行某些操作时需要通知父窗口时我做的是为该子窗口创建我自己的监听器接口。然后,我创建了一个在父窗口中实现接口的类,并将该类的实例传递给子窗口。然后,子进程在执行特定操作时调用接口方法。所以在你的情况下,我会做以下事情:

(注意:最好使用ActionListener而不是MouseListener来处理按钮点击。)

Frame2Listener接口

public interface Frame2Listener{
  void theButtonWasClicked(String textBoxValue);
}

第1帧(父母)

private void addButtonMouseClicked(java.awt.event.MouseEvent evt) {
  w = new window(new Frame2Listener(){
    public void theButtonWasClicked(String textBoxValue){
      TextFieldOn1stFrame.setText(textBoxValue);
    }
  });
  w.setVisible(true);
}

Frame2(孩子)

public window(final Frame2Listener fl){
  button1.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
      fl.theButtonWasClicked(texto.getText());
    }
  });
}
public void setHandler(MouseListener ml){
  //delete this method
}
public String getString(){
  //delete this method
}

我很想听听任何Swing专家是否这是一项好技术。

希望你喜欢Java! ;)

答案 1 :(得分:2)

好吧,我没有足够的代表对mangst的解决方案发表评论,但是想用你优雅高效的词语来补充一下,这似乎是一些设计模式的绝佳机会。

所描述的是观察者模式(http://en.wikipedia.org/wiki/Observer_design_pattern)的实现。但是,我建议有一个实现接口的对象集合,如mangst所示。这样,在给定的更新中,您可以遍历许多观察者以在每个观察者中执行某些操作,无论是更改数据,演示等。如果多个窗口需要从子窗口接收数据/操作,则很容易只需将另一个添加到您已有的观察者列表中。

还有Mediator模式(http://en.wikipedia.org/wiki/Mediator_pattern)可以实现类似的结果。

对于非常常见的计算问题,有许多cookie切割方法,通过熟悉词典,您可以轻松实现经过验证的真实方法。

答案 2 :(得分:1)

最好的方法可能是使用它的构造函数或适当的setter方法将该对象传递给另一个类。

public void setWindow(Window w) {
  this.w = w;
  // now you can use "w" variable in whole class
}