【问题标题】:How to access already running instance of a class without creating an actual object如何在不创建实际对象的情况下访问已经运行的类实例
【发布时间】:2013-04-07 01:40:26
【问题描述】:

Java GUI 有问题。这很难解释,但我会尽力而为。我有 2 个 GUI 类,一个是 I 类,另一个是 G 类。 I 类是从 main 方法启动的。在 I 类中有一个 G 类的字段(实例)。原因是 I 类收集重要信息并将其传递给 G 类的实例。当在 I 类中按下按钮时,将 I 类框架可见性设置为 false 和类 G 的实例为 true(显示 G 接口)。这里的问题是我希望能够在 G 中创建一个侦听器,将 I 的可见性设置为 true ,从而显示先前编辑的窗口。我有一个处理所有帧并创建一个新实例的解决方案,但这只显示了一个新清除的 I 实例。这里有一些代码 sn-ps:

第一类:

字段:

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 实例。

【问题讨论】:

  • 看看静态关键字;)
  • this 在 setter 方法中传递给另一个类。无论你做什么,都不要像@Hiro2k 推荐的那样使用静态。
  • 完美!!!非常感谢。我没有完全意识到“this”关键字的真正含义或作用,但现在我知道了。问题解决了!

标签: java multithreading class instance runnable


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      public class G
      {
          private I i;
          // ... other stuff
      
          public G(I i)
          {
              this.i = i;
          }
      }
      

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

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

      【讨论】:

        猜你喜欢
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多