正确使用内部类(如何在用户事件中共享类)

时间:2011-11-19 15:08:46

标签: java inner-classes

我正在尝试使用JFrame编写一个包含多个窗口的java应用程序。

每个JFrame包含一个JTextField和buton,以转到下一个JFrame。

我需要检索用户最后输入的所有信息。

我创建了一个事件点击buton,以便将用户在JTextField中引入的所有数据保存到公共类。我将该公共类命名为myData,它具有静态属性。

问题是我无法从按钮侦听器功能访问此类。

我收到错误:不能引用在不同方法中定义的内部类中的非final变量。

我的目标是能够在不同类的不同方法之间共享类myData。

E.g。我有一个名为myClass1和myClass2的类,所以我想在myClass1方法和myClass2方法之间共享myData属性。

请有人可以帮助我吗?或提出另一种方法来做到这一点!

提前致谢!

3 个答案:

答案 0 :(得分:1)

很抱歉,但您的设计需要大量工作。我建议你阅读MVC。现在看起来似乎很难咀嚼,但从长远来看它会对你有很大帮助。另外,请勿嵌套数据类定义,并记住要始终区分 对象

答案 1 :(得分:1)

所有关于MVC等的调用都是有效的,但这并不难。

你想要做的是在你的Main中,你可以创建你的数据(Model)类,这个类包含你所有的信息。

所以,你可以这样做:

public class F1 ... {
    private final Data myData;

    public F1(Data theData) {
        myData = theData;
    }

    ....
}

public class Main {
    Data myData;

    public static void main(String args[]) {
        Main m = new Main();
        m.setMyData(new Data());

        F1 f = new F1(m.getMyData());
        ...
     }
}

然后,稍后,当F1调用F2时,只需执行相同的操作 - 使用构造函数之前传入的Data创建F2。这样,当每个框架运行时,它们都在处理同一个Data实例。完成所有操作后,单个Data实例将保留在Main类中,以便您根据自己的需要进行操作。

有更好的方法可以重新组织整个程序,但这应该可以为您提供有关如何克服现在遇到的驼峰的想法。

补遗:

你可以做几件事。

当你获得ActionEvent时,它包含一个源。该源是生成事件的组件(在这种情况下很可能是Button)。如果您知道按钮在事物层次结构中的位置,则可以直接进入框架。在pastebin示例中,您有Frame - >面板 - >按钮。所以,如果你有Button,你就可以到达Frame。

public void actionPerformed(ActionEvent e) {
    JButton sourceButton = (JButton)e.getSource();
    F1 f1 = (F1)sourceButton.getParent().getParent();
    Data myData = f1.getMyData();
    data.setField(...);
}

同样,这不是推荐的做事方式。这些教程有很好的使用MVC和属性更改侦听器以及整个工具包的示例。但这应该让你到达你想去的地方。

答案 2 :(得分:0)

你交换JFrame的整体设计对我来说似乎有点不对劲。为什么不使用JDialog或JOptionPane这样的对话框,或者甚至更好地使用CardLayout来交换视图。另外,我建议你不要对任何一个使用静态字段,因为这会在将来引起严重的问题,并使你的代码不符合良好的面向对象原则。关于信息共享,我可以说的是,所有关于一个类都适当引用另一个类。有关更具体的建议,您可能需要向我们展示更多信息和代码。

修改
此外,您当然知道您可以通过调用传递到getSource()方法的ActionEvent对象上的actionPerformed来获取对刺激ActionListener的JButton的引用。这可能允许您在必要时获取包含JButton的类的引用。