我有2个课程Engine.java
和Window.java
。在Window.java
我有一个按钮,它将创建Engine.java
的实例。
如何将Window.java
传递给Engine.java
?
我知道我可以使用它,但这表示点按钮的那一刻按钮。
原因是我希望能够访问Window.java
中Engine.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 :(得分: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);
}