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

Java 在第二个类中访问另一个类的Swing组件,java,swing,methods,components,parent,Java,Swing,Methods,Components,Parent,我有两个类Engine.java和Window.java。在窗口.java中,我有一个按钮,它将创建引擎.java的实例 如何将Window.java传递到Engine.java? 我知道我可以用这个,但这个代表了点击按钮的那个一刻的按钮 原因是我想访问Engine.java中Window.java的所有组件 public class Engine{ Window window; public Engine(Window en){ window = en; }

我有两个类
Engine.java
Window.java
。在
窗口.java
中,我有一个按钮,它将创建
引擎.java
的实例

如何将
Window.java
传递到
Engine.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
        }
}
这应该有用

public class Window(){

Windows ref = this;
btnDownload.addMouseListener(new MouseAdapter() {
        @Override
            public void mouseClicked(MouseEvent e) {
                       Engine en = new Engine(ref);
                 }
原因是我想访问Engine.java中Window.java的所有组件


即使您确实实现了这一点,
引擎
也只能访问
窗口
中声明为
公共
的那些字段(除非它们在同一个包中,在这种情况下,
引擎
也将能够访问所有
默认
范围
窗口
方法).

将建议使用窗口。这是一个建议,但如果您只对组件感兴趣,那么为什么不:

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 };
    }
}
其中组件是java.awt.Component,或者您可以使用swing中的JComponent

如果你做了类似的事情,那么我想每个组件都只有名字才有意义。因此,您可以在每个组件上使用setName方法(如窗口构造函数中所示),并在引擎中执行某些操作,以便在需要时按名称访问它们——这可能是不好的。无论哪种方式,都需要对引擎中不同组件的引用。如果上面的示例不适用,您可以使用其他类或接口来公开组件

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关于传递窗口参考的意见。这种方法与良好的类设计封装技术背道而驰


仅供思考

您需要回到OOP的基础。投票结束。为了让这起作用,我相信
ref
必须是
final
。但是,既然你可以简单地使用限定的自我参照,为什么还要创建一个多余的自我参照呢?
this.myParams.getUpload().setText( "Engine class has changed me" );