Доступ к компонентам Swing другого класса во втором классе - PullRequest
0 голосов
/ 26 января 2012

У меня 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
        }
}

Ответы [ 4 ]

6 голосов
/ 26 января 2012
Engine en = new Engine(Window.this); 
2 голосов
/ 26 января 2012

Причина в том, что я хочу иметь доступ ко всем компонентам Window.java в Engine.java

Даже если вы это сделаете, Engine сможет толькополучить доступ к тем полям Window, которые объявлены public (если только они не находятся в одном пакете, в этом случае Engine также сможет получить доступ ко всем default областям Window методов).

1 голос
/ 26 января 2012

собирался предложить 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 };
    }
}

Где Компонент является java.awt.Component, или вы можете использовать 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:

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. Этот вид идет вразрез с хорошими методами инкапсуляции дизайна класса.

Просто пища для размышлений

0 голосов
/ 26 января 2012

это должно работать ...

public class Window(){

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