Как я могу включить в своем коде код actionListener для нажатия кнопки для извлечения данных, введенных в графический интерфейс для нескольких частей кода?

1

Я хочу выполнить вычисление в моем коде из netbeans, а вычисленные данные извлекаются из графического интерфейса, в котором есть событие action и прослушиватель onButtonClick(). Я хочу иметь возможность регулярно обращаться к этим данным с постоянными интервалами, чтобы помочь в вычислении. Моя проблема заключается в том, что мой код позволяет выполнять вычисления только один раз и после этого мое решение возвращает ложный ответ, так как переменные, введенные в GUI, становятся нулями.

Как кодировать, чтобы я мог постоянно обращаться к этим введенным графическим данным с фиксированными интервалами времени, не вводя их снова и снова?

Теги:
user-interface
actionevent
actionlistener

1 ответ

1

Похоже, ваш GUI слишком тесно связан с вашей бизнес-логикой.

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

Это автоматически дает вам несколько преимуществ:

  • Поскольку конфигурация теперь хранится конфиденциально, а не в графическом интерфейсе, изменения в графическом интерфейсе больше не влияют на конфигурацию текущего расчета - если только вы специально этого не хотите. У вас есть полный контроль.
  • Проверка ввода (например, проверка наличия номеров в диапазоне и т.д.) Может обрабатываться объектом вычисления. Это имеет много хороших последствий, особенно ваш расчет теперь может опираться на заявленные инварианты и всегда предполагать, что настроенные параметры находятся в допустимых диапазонах. Также вы можете инициировать вычисления средствами, отличными от вашего графического интерфейса, и все еще иметь проверку.
  • Разделив код расчета и конфигурацию из основного приложения, вы можете теперь делать всевозможные другие вещи, если хотите, например, выполнять несколько вычислений, выполняемых одновременно на нескольких потоках, или что-то еще.

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

Пример:

class Calculation {

   final int input1;
   final int input2;

   Calculation (int input1, int input2) {
      if (input1 < 0 || input2 < 0)
         throw new IllegalArgumentException("Inputs can't be negative."); // for example
      this.input1 = input1;
      this.input2 = input2;
   }

   void begin () {
      ...
   }

}

Затем, когда нажата кнопка GUI:

int input1 = ...; // get value from gui
int input2 = ...; // get value from gui
calculation = new Calculation(input1, input2);
calculation.begin();
// now the actual settings are preserved in 'calculation' regardless of gui changes.

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

Также вам не нужно иметь отдельный экземпляр Calculation для расчета; вы можете использовать сеттеры и т.д. и делать такие вещи, как:

class Calculation {

   final int input1;
   final int input2;
   boolean running;

   Calculation (int input1, int input2) {
       setInput1(input1);
       setInput2(input2);
   }

   void setInput1 (int input1) {
       if (running)
           throw new IllegalStateException("Inputs can't be changed while calculation running.");
       if (input1 < 0)
           throw new IllegalArgumentException("Input 1 can't be negative.");
       this.input1 = input1;
   }

   void setInput2 (int input2) {
       if (running)
           throw new IllegalStateException("Inputs can't be changed while calculation running.");
       if (input2 < 0)
           throw new IllegalArgumentException("Input 2 can't be negative.");
       this.input2 = input2;
   }

   void begin () {
       if (running)
           throw new IllegalStateException("Calculation is already running.");
       running = true;
       ...
   }

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню