2012-01-26 60 views
0

内另一类Swing组件我有2类Engine.javaWindow.java。在Window.java我有一个按钮,这将创建Engine.java的实例。访问第二类

我怎么能传递给Window.javaEngine.java

我知道,我可以用这一点,但在点击按钮的那一刻,这代表按钮。

原因是我想访问Engine.java内的所有Window.java组件。

public class Engine{ 
    Window window; 

    public Engine(Window en){ 
     window = en; 
    } 
    //rest of your code 
} 

public class Window(){ 

    btnDownload.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
       //At the point where you create the Engine 
        Engine en = new Engine(this); 
       //rest of your code 
     } 
} 
+0

你需要回到OOP的基础知识。投票结束。 – mre

回答

0

这应该工作...

public class Window(){ 

Windows ref = this; 
btnDownload.addMouseListener(new MouseAdapter() { 
     @Override 
      public void mouseClicked(MouseEvent e) { 
         Engine en = new Engine(ref); 
       } 
+1

为了达到这个目的,我相信'ref'必须是'final'。但是,为什么创建一个多余的自我引用,当你可以简单地使用合格的呢? – mre

2

的原因是,我想有内Engine.java

访问Window.java的所有成分

即使你实现这一点,Engine将只能够访问的这些领域该声明(除非他们是在同一个包,在这种情况下,Engine也将能够访问所有的default范围的Window方法)。

1

要建议的Window.this,但如果你只是在组件感兴趣,那么为什么不:

public class Engine { 
    Component[] components; 

    public Engine(Component[] components){ 
     this.components = components; 
    } 
} 

public class Window() { 

    JButton btnDownload; 
    JButton btnUpload; 

    public Window() { 

     btnDownload = new JButton("Download"); 
     btnDownload.setName("Download"); 

     btnUpload = new JButton("Upload"); 
     btnUpload.setName("Upload"); 

     btnDownload.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
        // create engine passing reference to only the components... 
        Engine en = new Engine(Window.this.getComponents()); 
        // rest of your code 
      } 
    } 

    public Component[] getComponents() { 
     return new Component[] { btnDownload, btnUpload }; 
    } 
} 

其中component是java.awt.Component中,或者你可以从摆动使用的JComponent。

如果你做了这样的事情,然后我猜每个组件将只通过名字意义。所以你可以在每个组件上使用setName方法(在Window构造函数中显示),并在引擎中执行某些操作以便在需要时通过名称访问它们 - 这可能很糟糕。无论哪种方式,您都需要引用引擎中的不同组件。如果上述示例不适合,您可以使用其他类或接口来公开组件。

Engine e = new Engine(new MyParams(Window.this.btnDownload, Window.this.btnUpload)); 

引擎构造:

public Engine(MyParams myParams) { 
    this.myParams = myParams; 
} 

访问这些引擎:

this.myParams.getUpload().setText("Engine class has changed me"); 

完全符合CUGA同意关于通过在窗口

public class MyParams { 
    private Component download; 
    private Component upload; 

    public MyParams(Component download, Component upload) { 
     this.upload = upload; 
     this.download = download; 
    } 

    public Component getUpload() { 
     return this.upload; 
    } 

    public Component getDownload() { 
     return this.download; 
    } 
} 
创建引擎时

然后参考。这种违背良好的类设计封装技术。

只是想到的食物