2013-04-07 72 views
1

我有Java GUI的问题。这很难解释,但我会尽我所能。我有2个GUI类,一个是I类,另外一个是G类。I类是从主要方法启动的。在类I中有一个G类的域(实例)。原因是类I收集重要信息并将它传递给类G的实例。当在类I中按下某个按钮时,该类将I类框架的可见性设置为false,并将类G类的实例为true(显示G接口)。这里的问题是,我希望能够使G中的监听器将I的可见性设置回真,从而显示先前编辑的窗口。我把所有帧的部署和创建新实例的解决方案,但只显示一的新清除实例下面是一些代码片段:如何在不创建实际对象的情况下访问已运行的类实例

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;..... 

套摹可见和不可见的我:

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类:注意,这里是因为我不断收到堆栈溢出错误,我不能让我一个实例。

硬重置:这一个刚刚创造了新的实例,同时处置我希望能够访问“已经运行的”休息(可能是浪费的,因为我的旧实例未正确关闭)

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); 
    } 
} 

我没有创建任何新的实例。

+0

看看static关键字;) – Hiro2k 2013-04-07 02:08:48

+0

将'this'传递给另一个类的setter方法。无论你做什么,不要使用@ Hiro2k推荐的静态。 – 2013-04-07 02:20:21

+0

完美!非常感谢。我没有完全意识到“这个”关键字的真正含义或做了什么,但现在我做到了。问题解决了! – pirate694 2013-04-07 16:35:24

回答

0

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

0

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

0

一种解决方案将是G类召开参考一

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

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

并在必要时隐藏自身,并显示“I” GUI窗口(或者不管它是什么)。如果类“I”是(拥有)“G”(这似乎来自你发布的代码的情况)的父亲,我会去解决这个问题。你可以最好地判断这是否是这种情况,但一个简单的例子是如果你有一个主窗口和一个对话窗口(在这种情况下它将充当孩子)。如果他们都是平等的公民(都属于第三类),那么我会传递给该类的引用,并在显示或隐藏“I”和“G”时让它管理。

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

+0

您的结构非常好,谢谢! – pirate694 2013-04-07 16:36:25

相关问题