Как передать пользовательский ввод из графического интерфейса в основной класс - PullRequest
3 голосов
/ 14 мая 2011

Я только начинаю работать с Java Swing, и у меня та же проблема, что и в прошлый раз. Я хочу написать программу, которая читает пользовательский ввод, выполняет алгоритм и отображает результат. Программа должна работать с двумя различными пользовательскими интерфейсами (консоль и графический интерфейс с Java Swing).

В настоящее время у меня есть пакет классов с алгоритмом (я могу просто передать пользовательский ввод и получить результат), класс, который содержит основной класс, класс для интерфейса консоли и класс для GUI (который продолжается от JFrame). Некоторый код:

<code>
public class Algorithm {
//<em>a lot of code</em>
}
public class MainClass {
    public static void main(...) {
        Algorithm algorithm = new Algorithm();
        //<em>use either console or GUI and read user input</em>
        algorithm.execute(<em>user input</em>);
        algorithm.getResult();
        //<em>display result on console/GUI</em>
    }
}
public class GUI extends JFrame implements ActionListener {
}

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

Должен ли я передать экземпляр алгоритма в графический интерфейс и вызвать методы алгоритма из графического интерфейса?
Или возможно реализовать ActionsListener в MainClass (где у меня есть экземпляр Algorithm)? Если я выберу этот способ реализации, как я могу передать результат алгоритма обратно в графический интерфейс?
Или я должен изменить всю реализацию? : D

Ответы [ 3 ]

2 голосов
/ 14 мая 2011

Краткий ответ: нет (по крайней мере, не в основной класс).

Длинный ответ: существует шаблон под названием Model-View-Controller (MVC), который объясняет, как получать данные от пользователя, что-то делать с ними и отображать снова.Эта ссылка (и весь сайт в целом) является хорошей отправной точкой: http://martinfowler.com/eaaDev/uiArchs.html

Применительно к вашему примеру кода:

public class Algorithm {
//a lot of code
}
public class MainClass {
    public static void main(...) {
        Algorithm algorithm = new Algorithm();
        GUI g = new GUI(algorithm );
    }
}
public class GUI extends JFrame implements ActionListener {
    private Algorithm algo;
    public GUI(Algorithm a) { this.algo = a; }
}

Algorithm играет роль моделиздесь и GUI представляет собой комбинацию контроллера и вида.

0 голосов
/ 14 мая 2011

Вы можете использовать Шаблон наблюдателя. В этом случае алгоритм - это java.util.Observer, а Gui - это java.util.Observable.

0 голосов
/ 14 мая 2011

Поскольку у вас есть Алгоритм, красиво инкапсулированный в своем собственном классе, тогда будет легко создать экземпляр объекта типа Algorithm в ответ на нажатие кнопки на вашем графическом интерфейсе и выполнить там алгоритм. Основной метод должен решить, нужен ли GUI, и запустить его.

Так что, если у вас есть кнопка с названием Calculate в вашем GUI, то:

  calculate.addActionListener(new ActionListener(){
          public void actionPerformed(ActionEvent e){
               //get the user input from the JFrame
               Algorithm algorithm = new Algorithm();
               algorithm.execute(user input);
               algorithm.getResult();
               //display results on the JFrame
          }
  });

Получение ввода из JTextField и т. Д. Просто, как

  mytextfield.getText();

и записать некоторое значение в JLabel для отображения:

  mylabel.setText("Some Text");
...