問題タブ [swingworker]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
1876 参照

java - サブクラスに抽象サブクラスの実装を強制する

SwingWorkerすべてのサブクラスに a (およびSwingWorkerの抽象doInBackground()and )を強制的に実装する抽象クラスを Java で作成したいと考えていますdone()

AbstractClass で -

これにより、拡張クラスが実装していない場合にコンパイラが例外をスローすることが予想されますが、そうではありません。

また、この抽象クラスをオーバーライドしていることをどのように示すかについてもよくわかりません。次のように ConcreteClass で再宣言しますか?

または他の方法ですか?

ご助力いただきありがとうございます!

0 投票する
2 に答える
2034 参照

java - Swing: JTree の更新に時間がかかりすぎて、他の GUI 要素がフリーズした場合はどうすればよいですか?

SwingUtilities.invokeAndWaitJava Swing の GUI コードは、または内に配置する必要があることを知っています SwingUtilities.invokeLater。このように、スレッド化は正常に機能します。

悲しいことに、私の状況では、GUI はバックグラウンド スレッドよりもはるかに時間がかかるものを更新します。より具体的には、約 400 エントリで JTree を更新します。ネストの深さは最大 4 です。ただし、1秒かかる場合もあります。ユーザーが遅延なく JTextPane に入力できるようにする必要があります。JTree の更新遅いと、入力中に JTextPane の遅延が発生します。ツリーが更新されるとすぐに更新されます。

私は Netbeans を使用しており、経験的に、Java アプリは残りの UI をフリーズすることなく多くの情報を更新できることを知っています。

どうすればそれができますか?

注 1: これらDefaultMutableTreeNodeはすべて の外部で準備されinvokeAndWaitます。
注2:ツリーに置き換えinvokeAndWaitinvokeLaterも更新されません。
注 3: 再帰的なツリー展開に最も時間がかかることに注意してください。
注 4: カスタム ツリー セル レンダラーを使用しています。使用せずに試して報告します。
注 4a: 私のツリー セル レンダラーはマップを使用して、作成された をキャッシュし、JTextComponentツリー ノードに応じて (キーとして) 再利用します。

手がかり 1 : うわー! カスタム セル レンダラーを設定しないと、 10 倍速くなります。カスタム ツリー セル レンダラーを作成するための適切なチュートリアルはほとんど必要ないと思います。残念ながら、カスタム セル レンダラーが必要です。

遅延読み込みに関するこのチュートリアルが役立つかもしれません。

0 投票する
1 に答える
847 参照

java - Java Swingworker:カプセル化されたクラスほどではありません

カプセル化されたクラスではないSwingWorkerクラスで、情報の受け渡し、進行状況の更新、および「完了」の表示に問題があります。

ハードドライブ上のファイルとディレクトリを処理する単純なクラスがあります。ユーザーが[スタート]ボタンをクリックすると、SwingWorkerのインスタンスが起動します。

プログレスバーを更新するために、SwingWorkerからのイベントドリブンスレッドのJTextAreaで処理されるファイルの名前を印刷したいと思います。Web上のすべての例はネストされたクラス用であり、ネストされたクラスは外部クラス(doneメソッドなど)の変数にアクセスします。また、EDTが[スタート]ボタンの有効化(およびフィールドのクリア)などのアクションを実行できるように、SwingWorkerが終了したことをイベントドリブンスレッドに通知したいと思います。

私の質問は次のとおり です。1。SwingWorkerクラスは、イベントドリブンスレッドのJTextAreaにテキストをどのように配置し、プログレスバーを更新しますか?

  1. EDTは、{ external } SwingWorkerスレッドがいつ終了したかをどのように判断しますか?

{多くのコード(および処理)が実行されるため、SwingWorkerをネストされたクラスとして使用したくありません。}

0 投票する
2 に答える
258 参照

java - Swingworkerが重複した出力/出力を順不同で生成していますか?

SwingWorkerを使用するときに配信を保証する適切な方法は何ですか?InputStreamからJTextAreaにデータをルーティングしようとしていますが、このexecuteメソッドを使用してSwingWorkerを実行しています。私はここの例に従っていると思いますが、結果が乱れ、重複し、一般的に意味がありません。

これが私の機能していないSwingWorkerです:

0 投票する
1 に答える
3328 参照

java - Java - SwingWorker - process() メソッドの問題

javax.swing.SwingWorker初めて使用しています。

JLabel次のように、swing ワーカーによって公開された中間結果からa を更新したいと思います。

を更新するためJLabelに、次のようにコーディングしました。

上記のコードは機能しますが、私の問題 (より具体的には、私の疑問) は次のとおりです。

上記の Swing ワーカー タスクは匿名の内部クラスであるため、labelフィールドにアクセスできます。

しかし、swing ワーカー クラスを非インナー クラスにしたい場合はどうすればよいでしょうか。labelprocess() メソッドがアクセスできるように、swing ワーカー クラスのコンストラクターに引数として渡す必要がありますか。

または他の方法はありますか?

Swing ワーカー クラスが内部クラスでない場合、Swing ワーカー クラスの結果から UI コンポーネントを更新するために、他の開発者はどのようなアプローチに従いますか?

0 投票する
3 に答える
6340 参照

java - デフォルトの Java SwingWorker スレッド プールを管理するには?

私は 2 つの長時間実行される SwingWorker タスクを使用するアプリケーションを持っています。そのうちの 1 つだけを開始する、更新された JVM を備えた 2 台の Windows コンピューターに遭遇しました。エラーは表示されていないため、デフォルトのスレッド プールにはスレッドが 1 つしかないため、実行しようとすると 2 番目の SwingWorker オブジェクトがキューに入れられると想定する必要があります。

では、(1) デフォルトの SwingWorker スレッド プールで使用可能なスレッド数を確認するにはどうすればよいでしょうか? (2) スレッドがさらに必要になった場合にスレッドを追加するにはどうすればよいでしょうか?

他に知っておくべきことはありますか?この明らかなシングル スレッド スレッド プールの状況は、私の予想に反します。

ThreadPoolExecutor を設定していますが、これは間違っているようです...

0 投票する
3 に答える
2716 参照

java - SwingWorker を使用してリストを返す方法

を使用してファイルから画像をロードする画像ギャラリーを作成する必要がある課題がありSwingWorkerます。画像がロードされると、画像を反転してスライドショーを再生できます。を使用してロードされたイメージのリストを取得するのに問題がありますSwingWorker

これは、結果を TextArea にパブリッシュするバックグラウンドで発生することです。

}
}

完了したら、画像を a に挿入するだけList<Image>です。

@Override protected void done() { 試行 {

}

また、取得する必要があるのはリストからlist呼び出されたものを返すメソッドを作成しましたが、たとえば呼び出したときに機能しませんgetImages()getImages()execute()

に到達するimageListと、何も返されません リストを取得できた唯一の方法は、リストを取得する別の方法がありますか、それともメソッドが唯一の方法ですか?のrun()代わりに を使用したときでした。または、おそらくクラスを理解していません。execute()run()Swing Worker

0 投票する
3 に答える
2246 参照

java - Java - SwingWorker - problem

I am developing a Java Desktop Application. This app executes the same task public class MyTask implements Callable<MyObject> { in multiple thread simultaneously.

Now, when a user clicks on a "start" button, I have created a SwingWorker myWorker and have executed it.

Now, this myWorker creates multiple instances of MyTask and submits them to an ExecutorService.

Each MyTask instance has a loop and generates an intermediate result at every iteration. Now, I want to collect these intermediate results from each MyTask instances as soon as they are generated. Then after collecting these intermediate results from every MyTask instance, I want to publish it through SwingWorker.publish(MyObject) so that the progress is shown on the EDT.

Q1. How can I implement this? Should I make MyTask subclass of SwingWorker instead of Callable to get intermediate results also, because I think that Callable only returns final result.

Q2. If the answer of Q1. is yes, then can you give me a small example to show how can I get those intermediate results and aggregate them and then publish them from main SwingWorker?

Q3. If I can't use SwingWorker in this situation, then how can I implement this?

0 投票する
4 に答える
3977 参照

java - Java - SwingWorker - EDT の代わりに、他の SwingWorker から 1 つの SwingWorker を呼び出すことはできますか

私は次のように持ってSwingWorkerいます:

Swing Worker上記を EDT から呼び出しました。

これでmainWorker、クラスの 10 個のインスタンスが作成MyTaskされ、各インスタンスが独自のスレッドで実行されるようになり、作業がより速く完了します。

しかし問題は、タスクの実行中に時々 GUI を更新したいということです。タスクがmainWorkerそれ自体で実行された場合、publish()およびprocess()メソッドを使用して GUI を更新できたことはわかっています。

しかし、タスクはスレッドとは異なるスレッドによって実行されるため、タスクを実行するスレッドSwingworkerによって生成された中間結果から gui を更新するにはどうすればよいですか。

0 投票する
2 に答える
8470 参照

java - Java - SwingWorker と SwingUtilities.invokeLater() の違い

SwingWorker次の目的で使用されます。

  • GUI が応答しなくなるのを防ぐために、別のスレッドで実行時間の長いタスクを実行するため
  • メソッドを介してタスクの最後に長時間実行タスクによって生成された結果で GUI を更新しますdone()
  • publish()およびメソッドを使用して、タスクによって生成および公開された中間結果を使用して、GUI を随時更新しprocess()ます。

SwingUtilities.invokeLater()上記のタスクを次のように実行できます。

  • SwingWorker.execute()EDT からメソッドを実行する代わりに、ExecutorService.submit(new MyRunnable())長時間実行されるタスクを実行できる別のスレッドも作成されるため、実行できます。
  • タスクの最後に GUI を更新するために、コード ( done()case1 のメソッドで記述)をタスクの最後に置くことができSwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode())ます。
  • タスクの途中で GUI を更新するには、 case1 のメソッドを呼び出した場所にコード ( process()case1 のメソッドに記述)を配置します。SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode())publish()

質問Java - SwingWorker - EDTの代わりに他のSwingWorkerから1つのSwingWorkerを呼び出すことができますかで指定された問題は解決できますが、解決SwingUtilities.invokeLater()できないため、この質問をしていますSwingWorker