我遇到了Java GUI问题。这很难解释,但我会尽力而为。我有2个GUI类,一个是类I,另一个是类G.类I是从main方法启动的。在类I中有一个字段(实例)类G.原因是类I收集重要信息并将其传递给类G的实例。当在类I中按下按钮时,它将类I框架可见性设置为false和G类的实例为true(显示G接口)。问题在于我希望能够在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 visible和I invisible:
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错误。
硬重置:这个只是在处理其余部分时创建新实例(可能是浪费,因为我的旧实例没有正确关闭)
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实例而不创建任何新实例。
答案 0 :(得分:0)
您可以将对“I”的引用传递给“G”(通过构造函数或setter),并在actionPerformed
中使用它将可见性设置为true。如果您只有一个“I”实例,则另一种方法是创建一个静态引用,您可以从“G”引用。
答案 1 :(得分:0)
一个解决方案是让G级保留对I的引用。
public class G
{
private I i;
// ... other stuff
public G(I i)
{
this.i = i;
}
}
必要时隐藏自己并显示“I”GUI窗口(或其他任何内容)。如果类“I”是(拥有)“G”的父级(我们发布的代码似乎就是这种情况),我会选择此解决方案。你是最能确定是否是这种情况的人,但一个简单的例子就是你有一个主窗口和一些对话窗口(在这种情况下它将充当孩子)。如果他们都是平等的公民(两者都属于某些第三类),我会传递对该类的引用,并在显示或隐藏“I”和“G”时进行管理。
另一种解决方案是使用单例设计模式,如果您确定只需要1个类的实例。我没有足够的经验来说它是不是好或坏,但我已经看到了很多对这种设计模式的消极性,所以要谨慎使用。
答案 2 :(得分:0)
您可以从传递到ActionListener的actionPerformed方法的ActionEvent对象中获取当前顶级窗口。获取导致通过getSource()
调用侦听器的源对象,然后调用源上的SwingUtilities.getWindowAncestor()
以获取Window(JFrame,JDialog或其他任何内容)。