Java передает значения между двумя классами без проблем - PullRequest
2 голосов
/ 16 декабря 2011

У меня довольно простой вопрос.У меня есть один класс GUI и другой, который выполняет некоторую фоновую обработку.Обычно у меня есть некоторые методы в фоновом классе (которые состоят из нескольких потоков), которые могут возвращать результат при вызове, и я могу использовать результат в классе GUI.

Но теперь у меня возникла странная проблема: графический интерфейс должен отображать что-то, что требует фонового класса для вызова внешнего процесса, и после подключения к этому процессу соединение останется открытым, и поэтому я не могу ничего вернутьесли поток не закрыт.Однако процесс продолжает посылать данные, которые должны отображаться в графическом интерфейсе

Если я помещаю оба в один класс, я могу это сделать;простым вызовом, например, JLabel.setText (что когда-либо исходит от внешнего prcess в бесконечном цикле while).Однако, если он находится в другом классе, я не могу получить доступ к этому JLabel или любому другому компоненту из другого класса.Если я объявляю их статическими, GUI выдает исключение, есть ли я в любом случае, чтобы избежать этого, или единственная возможность написать код вместе в одном классе с GUI

Ответы [ 3 ]

5 голосов
/ 16 декабря 2011

Вам нужно решить две проблемы.

Во-первых, вам нужны средства для общения из одного класса в другой. Есть много способов решить эту проблему. Например, рабочий класс может публиковать события, подписанные классом GUI. Или вы можете передать рабочему классу ссылку на объект GUI (возможно, в качестве типа интерфейса).

Во-вторых, вам нужно обновлять графический интерфейс только из потока событий. Вы можете сделать это примитивно с SwingUtilities.invokeAndWait (Runnable) или SwingUtilities.invokeLater (Runnable) . Или вы можете использовать инфраструктуру более высокого уровня, предоставляемую классом SwingWorker .

2 голосов
/ 16 декабря 2011

Вы бы реализовали шаблон наблюдателя .Примерно так:

public interface DataObserver {
   void newDataCame(String someData);
}

public class GUIclass {
    public void method() {
       bgClass.callInBg( new DataObserver() {
           public void newDataCame(String someData) {
               JLabel.setText(someData);
           }
       } );
    }
}

public class BGClass {
    public void callInBg(DataObserver observer) {
        while(true) {
            String data = null;
            // read some data;
            observer.newDataCame(data);
        }
    }
}

Таким образом, ваш фоновый класс будет уведомлять вас GUI-класс о новых данных, поступающих от внешнего процесса.Но вы должны быть осторожны с обновлениями GUI и потоком GUI.

0 голосов
/ 16 декабря 2011

Ну, вы можете создать функцию для установки текста в классе GUI, чтобы вам не нужно было объявлять текстовое поле как общедоступную глобальную переменную.Но что касается звонков из другого класса, у вас есть два основных варианта.Одним из них является передача другому классу экземпляра вашего класса GUI, который он затем может использовать для вызова метода для установки текста.Другой вариант, если вы хотите, чтобы он был статическим, - это сделать класс GUI синглтон-классом и иметь статический метод, который использует его для установки текста.

Например, если ваш класс называется GUI, настройте его следующим образом:это:

public class GUI {
     private static GUI singleton = new GUI();
     private GUI(){}
     public GUI getInstance(){
          return singleton;
     }
}

или вместо getInstance и вызова функции, которую вы можете иметь:

public class GUI {
     private static GUI singleton = new GUI();
     private GUI(){}
     public void setText(){
          //your code
     }

     public static void setTheText(){
          singleton.setText();
     }
}

Будьте осторожны с этим, хотя создание одиночных классов может быть опасным для вашего дизайна, если вбудущее, в котором вы когда-либо хотели бы иметь несколько экземпляров класса.

...