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