建议:
- 听起来你的GUI代码是为了制作JFrame,如果是这样,你会想要避免这种情况。你通过让你的类扩展JFrame来强迫你创建和显示JFrame,而通常需要更多的灵活性。事实上,我冒昧地说,我创建的大部分Swing GUI代码和我见过的不扩展JFrame,事实上你很少想做这个。
- 更常见的是,您的GUI类将面向创建JPanels,然后可以将其放置到JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts交换。这将大大提高GUI编码的灵活性。
- 这个问题直接关系到你的问题。我猜你的主要问题不是如何给出类getter方法,以及如何让其他类调用getter方法。更常见的是,当面临从一个GUI视图向另一个GUI视图提取信息的问题时,问题是 之一来提取信息。如果您将第二个窗口显示为非模态JFrame,然后让调用类立即从第二个JFrame中提取数据,那么您将获得无意义的数据,因为您将在用户有时间进行交互之前提取数据用第二个窗口输入数据。
- 使用非模态窗口从用户获取信息时,一种可能的解决方案是使用WindowListener,以便在用户完成对第二个窗口的处理时收到通知,因此现在可以安全地提取数据
- 通常更好的是第二个窗口不是非模态的,因为JFrame是,而是一个模态窗口,如模态JDialog。当调用代码显示模式对话框时,调用代码中的所有代码流都会停止,直到对话框不再可见。在这种情况下,不需要WindowListener,因为您可以确切地知道对话框何时被处理 - 在您将其设置为可见之后立即在代码行上 - 因此可以轻松地从中提取数据。
- Andrew Thompson在评论中已经提到了一个不错的变体 - 使用JOptionPane。不要选择这个选项,因为JOptionPanes是功能强大的工具,可能比你意识到的要强大得多,因为它们可以保存完全形成的复杂JPanel视图,并且行为如上所述,作为模态对话框。
醇>
如果您需要更具体的帮助,请不要犹豫,对此答案发表评论。如果是这样,那么考虑创建并发布Minimal, Complete, and Verifiable Example Program,其中您将代码压缩到仍然编译和运行的最小位,没有外部依赖(例如需要链接到数据库或图像),没有额外的代码与您的问题无关,但仍然可以证明您的问题。
修改强>
对于上述建议的mcve代码示例,请回答以下StackOverflow问题:
我假设text1存在于frame1中,你想在frame2中访问它们。以下是实现这一目标的方法:
- 首先为frame1中的所有JTextField创建getter。
或者,您可以将它们放在面板中并调用getComponents()方法。
- 在frame2中创建一个JFrame类型的私有变量。
- 修改frame2的构造函数以接收frame1对象并将其分配给JFrame类型的私有变量。
- 现在你可以在frame2中创建一个close()方法来处理frame2并将frame1设置为visible。
醇>
但在我看来,你应该创建一个处理这些文本字段中数据的类。在任何按钮单击frame1中初始化类对象,并检查输入中是否存在任何不一致。我猜你的设计有问题。