0

これが可能かどうかはわかりません。私は宝くじアプリケーションを作成しており、できるだけ少ない GUI コンポーネントを使用しようとしています。したがって、次のメッセージを表示するはずの JTextArea があります(たとえば):

「計算中…55.4%」

コンソールに出力すると問題なく表示されますが、JTextArea には出力されません。SwingUtilities.invokeLater を使用しようとしましたが、それも機能しません。

    for (int x = 0; x < daysBetween; x++)
    {
      completion = "Calculating..." + df.format((100 * (x + 1)) / daysBetween) + "%";
      if (!textArea.getText().equals(completion))
      {
        textArea.setText(completion);
      }
      /*
      Here I have a lot of irrelevant code that compares your tickets to the winning tickets and counts your winnings and other statistics...
      */
    }

    ticketReport += "Computation time: " + getElapsedTime(start, System.nanoTime());
    ticketReport += "\nEnd date: " + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.DAY_OF_MONTH) + "/" + cal.get(Calendar.YEAR); 
    ticketReport += "\nTotal # of tickets purchased: " + numOfTicketsPurchased;
    /*
    etc. with filling out the ticket report
    */
    textArea.setText(ticketReport);

ご想像のとおり、上記の for ループで textArea のテキストを設定すると、JTextArea が更新されます。メソッドの最後まで JTextArea を更新しません。これは、チケット レポートを表示するようにテキスト領域を設定したときの一番下です。

抽選フィーバー応募

最終目標: 最終的にはこれを Android フォン アプリケーションにしたいので、ポップアップなどは一切使用したくありません。

4

2 に答える 2

0

私のオリジナルの SwingWorker アプローチでは、JTextArea で完了パーセンテージ ステータスが表示されるようになりました。操作をキャンセルするオプションを追加しましたが、キャンセルしようとすると、「スレッド」(SwingWorker) がキャンセルされませんでした。キャンセルして再起動すると、常にスタックします。もう一方が進行中に連続して開始するたびに、計算がますます遅くなり、不正確な情報が得られます。

この 2 回目に行った方法で、元の問題とこの新しい問題が解決されました。Thread を拡張する新しいプライベート クラスを作成し、その run() メソッドをオーバーランして、スレッドで実行されるコードをそのメソッドに挿入しました。潜在的な問題のためにスレッドを停止する方法が非推奨になっていることに気付いたので、ユーザーがスレッドの停止を要求したときに設定されるブール値を作成し、スレッド内で定期的にブール値を読み取り、等しいときに終了します真に。

スレッドを開始する方法は、オブジェクト BackgroundCalc を再初期化し、その start() メソッドを呼び出すことです。

  private class BackgroundCalc extends Thread
  {
    public void run()
    {
      /*
      initializing stuff here
      */
      for (int x = 0; x < daysBetween; x++)
      {
        progress = (100 * (x + 1)) / daysBetween;
        if (destroyCalcThread) return;
        /*
        background calculations here
        */
      }
      /*
      finish up thread here
      */
    }
  }

私はスレッドに少し慣れていないので、ここでの苦労と説明した方法が、この概念に不慣れな他の人の助けになることを願っています.

于 2016-02-26T06:25:42.257 に答える
0

/* 編集: これで問題は一時的に解決しましたが、別の問題に遭遇しました。パラメータ true を指定してキャンセル メソッドを呼び出して SwingWorker をキャンセルしようとすると、キャンセルされませんでした。これを解決した方法については、他の回答を参照してください。*/

私はそれを考え出した。上記のメソッドは、次のように SwingWorker 内に配置します。

      SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>()
      {
        @Override
        protected Void doInBackground() throws Exception
        {
          //method here
        }
      }

そのメソッド内で、「(100 * (x + 1)) / daysBetween」というパラメーターを指定して setProgress メソッドを呼び出し、正しい完了率を表示しました。その後、私はこれを追加しました:

      sw.execute();
      sw.addPropertyChangeListener(new PropertyChangeListener()
      {
        @Override
        public void propertyChange(PropertyChangeEvent arg0)
        {
          textArea.setText("Calculating..." + sw.getProgress() + "%");
          if (sw.getProgress() == 100)
            textArea.setText(ticketReport);
        }
      });

もともと欲しかった #.## ではなく整数としてパーセンテージが表示されますが、必要に応じて非常に簡単に変更できます。

于 2016-02-25T00:58:02.283 に答える