在第二类中访问另一个类的Swing组件

时间:2012-01-26 13:15:03

标签: java swing methods components parent

我有2个课程Engine.javaWindow.java。在Window.java我有一个按钮,它将创建Engine.java的实例。

如何将Window.java传递给Engine.java

我知道我可以使用它,但这表示点按钮的那一刻按钮。

原因是我希望能够访问Window.javaEngine.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
        }
}

4 个答案:

答案 0 :(得分:6)

Engine en = new Engine(Window.this); 

答案 1 :(得分:2)

  

原因是我希望能够访问Engine.java中的所有Window.java组件

即使您确实实现了这一点,Engine也只能访问Window声明为public的字段(除非它们位于同一个包中,在这种情况下, Engine也可以访问所有default范围Window方法。

答案 2 :(得分: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,或者你可以使用swing中的JComponent。

如果您做了类似的事情,那么我猜每个组件只会因名称而有意义。因此,您可以在每个组件上使用setName方法(在Window构造函数中显示),并在引擎中执行某些操作,以便在需要时按名称访问它们 - 这可能很糟糕。无论哪种方式,您都希望引用引擎中的不同组件。如果上面的示例不合适,您可以使用其他类或接口来公开组件。

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

然后在创建引擎时:

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关于传递Window参考。这种方式违背了良好的类设计封装技术。

只需要深思熟虑

答案 3 :(得分:0)

这应该有用......

public class Window(){

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