如何在不创建实际对象的情况下访问已运行的类实例

时间:2013-04-07 01:40:27

标签: java multithreading class instance runnable

我遇到了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实例而不创建任何新实例。

3 个答案:

答案 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或其他任何内容)。