1

我想从 netbeans 在我的代码中执行计算,并且计算的数据是从具有 onButtonClick() 操作事件和侦听器的 GUI 中检索的。我希望能够以恒定的时间间隔重复访问这些数据以帮助计算。我的问题是我的代码只允许执行一次计算,之后我的解决方案返回错误答案,因为输入到 GUI 的变量变为零。

我如何编写代码,以便我可以以固定的时间间隔不断地访问这些 GUI 输入的数字,而不必一遍又一遍地输入它们?

4

1 回答 1

1

听起来您的 GUI 与您的业务逻辑联系得太紧密了。

您有很多选择,但一种方法是将计算所需的设置存储为某个类中的字段(也许将您的计算拆分为自己的类)。然后,当按下 GUI 按钮时,从 GUI 中获取配置,解析并复制到计算对象,然后执行计算。

这会自动为您带来一些优势:

  • 由于配置现在私下存储而不是存储在 GUI 中,因此 GUI 更改不再影响正在运行的计算的配置——除非您特别希望它们这样做。你有完全的控制权。
  • 输入验证(例如检查数字是否在范围内等)可以由计算对象处理。这有很多好的结果,最值得注意的是,您的计算现在可以依赖于声明的不变量,并始终假设配置的设置在有效范围内。您还可以通过 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您也可以使用 setter 等,并执行以下操作:

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;
       ...
   }

}
于 2014-03-14T23:47:41.960 回答