1

我对 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 可见和 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 的“已运行”实例。

4

3 回答 3

0

您可以将对“I”的引用传递给“G”(通过构造函数或设置器)并使用它actionPerformed来将可见性设置为真。如果您只有一个“I”实例,另一种方法是创建一个静态引用,您可以从“G”引用它。

于 2013-04-07T02:24:29.037 回答
0

一种解决方案是让 G 类持有对 I 的引用。

public class G
{
    private I i;
    // ... other stuff

    public G(I i)
    {
        this.i = i;
    }
}

并在必要时隐藏自身并显示“I”GUI 窗口(或其他任何内容)。如果类“I”是(拥有)“G”的父级(您发布的代码似乎就是这种情况),我会选择这个解决方案。您是最能确定是否是这种情况的人,但一个简单的例子是您是否有一个主窗口和一些对话框窗口(在这种情况下将充当子窗口)。如果他们都是平等的公民(都属于某个第三类),我将传递对该类的引用,并在显示或隐藏“I”和“G”时对其进行管理。

如果您确定只需要一个类的实例,另一种解决方案是使用单例设计模式。我没有足够的经验来判断它是好是坏,但我已经看到很多对这种设计模式的消极态度,因此请谨慎使用。

于 2013-04-07T02:32:27.843 回答
0

您可以从传递给 ActionListener 的 actionPerformed 方法的 ActionEvent 对象获取当前顶级窗口。获取导致调用监听器的源对象,getSource()然后SwingUtilities.getWindowAncestor()在源上调用以获取 Window(JFrame、JDialog 或任何可能的名称)。

于 2013-04-07T02:40:36.673 回答