我正在尝试使用JFrame编写一个包含多个窗口的java应用程序。
每个JFrame包含一个JTextField和buton,以转到下一个JFrame。
我需要检索用户最后输入的所有信息。
我创建了一个事件点击buton,以便将用户在JTextField中引入的所有数据保存到公共类。我将该公共类命名为myData,它具有静态属性。
问题是我无法从按钮侦听器功能访问此类。
我收到错误:不能引用在不同方法中定义的内部类中的非final变量。
我的目标是能够在不同类的不同方法之间共享类myData。
E.g。我有一个名为myClass1和myClass2的类,所以我想在myClass1方法和myClass2方法之间共享myData属性。
请有人可以帮助我吗?或提出另一种方法来做到这一点!
提前致谢!
答案 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的类的引用。