我在使用 Java GUI 时遇到问题。这很难解释,但我会尽力而为。我有 2 个 GUI 类,一个是 I 类,另一个是 G 类。I 类是从 main 方法启动的。在 I 类中有一个 G 类的字段(实例)。原因是 I 类收集重要信息并将其传递给 G 类的实例。当 I 类中按下按钮时,会将 I 类框架可见性设置为 false,并且将类 G 的实例设置为 true(显示 G 接口(interface))。这里的问题是我希望能够在 G 中创建一个监听器,将 I 的可见性设置回 true,从而显示之前编辑的窗口。我有一个处理所有框架并创建一个新实例的解决方案,但这仅显示了一个新的已清除的 I 实例。以下是一些代码片段:
第一类:
字段:
private JFileChooser j;
private FileFilter filter;
private GUI g; //<--- it is initialized shortly after.
private Font masterFont;
private JFrame frame;
private JButton done;
private JButton browse1;
private JButton browse2;.....
设置 G 可见,I 不可见:
class Done implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < 9; i++) {
System.out.println(array[i]);
}
g.setArray(array);
System.out.println(array);
setText();
frame.setVisible(false);
g.setVisible(true);
g.setVisible2(false);
if (g.clear.isSelected()) {
frame.setVisible(true);
}
}
G 类:注意,这里我无法创建 I 的实例,因为我不断收到 Stack Overflow 错误。
硬重置:这个只是创建新实例,同时处理其余实例(可能很浪费,因为 I 的旧实例没有正确关闭)
private class Reset implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
frame.dispose();
frame2.dispose();
Runnable runnable = new Runnable() {
@Override
public void run() {
Intro g = new Intro();
g.setVisible(true);
}
};
EventQueue.invokeLater(runnable);
}
}
我希望能够访问 I 的“已运行”实例,而无需创建任何新实例。
最佳答案
您可以从传递到 ActionListener 的 actionPerformed 方法中的 ActionEvent 对象获取当前顶级窗口。通过 getSource() 获取导致调用监听器的源对象,然后在源上调用 SwingUtilities.getWindowAncestor() 来获取 Window(JFrame、JDialog、或无论是什么)。
关于java - 如何在不创建实际对象的情况下访问类的已运行实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15857984/