問題タブ [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.
java - EDTをブロックせずにEDTでオブジェクトが作成されるのを待つ方法は?
イベントディスパッチスレッドから呼び出され、完全に初期化されたUIコンポーネントを返す必要があるJavaライブラリでAPIを使用しています。次のようになります。
ただし、データベースからロードした後にのみダイアログにデータを入力できます。これには10秒かかる場合があります。通常はバックグラウンドスレッドでこれを行いますが、このメソッドはEDTから呼び出され、ダイアログを返す必要があるため、機能しません。これはサードパーティのライブラリなので、メソッドを変更することはできませんが、EDTのブロックを回避するためにできることはありますか?
java - バックグラウンドタスクの進捗状況を報告するにはどうすればよいですか?
ExecutorServiceスレッドプールのバックグラウンドで実行されている長時間実行タスクがあります。進捗状況または中間結果を返すこのタスクに関するいくつかのベストプラクティスは何ですか?この機能を提供するライブラリはありますか?
編集:明確にするために、私は進行状況をユーザーではなく他のコードに報告することについて話している。
通常はSwingWorkerを使用しますが、GrailsアプリのJava / Groovyバックエンドを使用しており、EDTとの関係があるため、ヘッドレスサーバー環境でどのように動作するかわかりません。
もう1つの例は、Eclipse RCPのJobsフレームワークですが、UIとは関係のないものが必要になります。
java - JavaGUIとSwingWorkerクラスの複数のインスタンス
私はJavaを使用してGUIを作成しています(そうではありませんか?)。Swing Workerクラスを使用すると、バックグラウンドでの計算が可能になり、GUIがハングするのを防ぐことができますが、ここで良いことが多すぎるのではないかと思っていました...
たとえば、実行中のバックグラウンドスレッドのインスタンスが多すぎる場合、コンピューターによってはプログラムのパフォーマンスに影響しますか?単純ですが重要な質問です。ご意見をいただければ幸いです。御時間ありがとうございます。
java - 別のプログラムの出力を Java テキスト領域に出力する
Javaを使用してGUIを作成しています。この GUI は、ProcessBuilder クラスを使用してコマンド ラインからプログラムを起動します。
起動中のプロセスに関する小さな情報: コマンドラインから、別のウィンドウを作成し、そのウィンドウに情報を出力します。
私のGUIウィンドウには、出力をリダイレクトしたい場所へのテキスト領域があります。私は当初、SwingWorker オブジェクトを使用して、より多くの出力を常にチェックし、GUI を保持しないようにするつもりでした。テストして元の構文がダウンしていることを確認するために (GUI を使用することさえせずに)、2 次プロセスのウィンドウからの出力を System.out に出力すると考えました。ただし、セカンダリ プロセスのウィンドウには出力が表示されますが、作業している端末には表示されないため、何かがおかしいようです。
コードの抜粋は次のとおりです。
ブール値の run はプログラムの別の場所で定義され、プロセス p が終了するか強制終了されると false に設定されます (追加の質問: それは本当に悪い考えですか? 私はそうかもしれないと感じています...)。
他のウィンドウに出力されているのを見たときに出力が得られない理由について、誰かが考えを持っていますか? 当初、私の反応は p.getOutputStream() を使用することでしたが、スキャナーはパラメーターとして outputStream を取りません。
お時間をいただきありがとうございます。
java - 新しい URL にリダイレクトするとアプレットがクラッシュする
ユーザーがボタンをクリックすると、いくつかの作業を行ってから URL にリダイレクトするアプレットを開発しています。GUIがロックアップするのを防ぐためにSwingWorkerを使用しています。
しかし、アプレットを実行すると、ボタンをクリックした後に次のエラーが表示されます。
スレッド「SwingWorker-pool-1-thread-2」での例外 java.lang.IllegalMonitorStateException at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(Unknown Source) at java.util.concurrent.locks.AbstractQueuedSynchronizer.release( java.util.concurrent.locks.ReentrantLock.unlock(不明なソース) で java.util.concurrent.LinkedBlockingQueue.poll(不明なソース) で java.util.concurrent.ThreadPoolExecutor.getTask(不明なソース) でutil.concurrent.ThreadPoolExecutor$Worker.run(不明なソース) で java.lang.Thread.run(不明なソース)
アプレットが自分自身を破壊しているように見えますが、ワーカー スレッドはまだ生きています。Thread.sleep(2000);を追加すると、テストとして、アプレットは正しく動作しますが、それは正しい修正方法ではないと思います。
私が間違っていることは何ですか?? たぶん、メインスレッドからリダイレクトする必要がありますか? アプレットの destroy メソッドは、ワーカー スレッドが終了するまで待機する必要があるのでしょうか。
Java ソース:
HTML ソース:
java - Future の進行状況を取得する機能物体
java.util.concurrent パッケージと Future インターフェースを参照すると、長いタスクを開始して進行状況を照会できる機能は、SwingWorker 実装クラスにのみ付属していることに気付きました (間違っていなければ)。
これは、次の疑問を投げかけます。
非 GUI、非 Swing アプリケーション (コンソール アプリケーションをイメージする) で、バックグラウンドで長いタスクを開始し、他のスレッドが進行状況を検査できるようにする方法はありますか? この機能をスイング/GUI アプリケーションに限定すべき理由はないように思えます。それ以外の場合、私が見る限り、使用可能な唯一のオプションは、Future オブジェクトを返す ExecutorService::submit を経由することです。ただし、基本の Future インターフェイスでは、進行状況を監視できません。
java - GUI の応答性を高める
私が持っているプログラムは、物理シミュレーションを(基本的に)視覚化します。現時点では動作しますが、非常に応答しなくなる可能性があります。その理由はわかっていると思います。イベント スレッドで実行される (read:all) 計算が多すぎます。
「再生」ボタンが押されると、Timer
定期的に起動して呼び出す Swing が作成されupdateTime()
ます。問題は、updateTime()
すべての時間依存オブジェクトを繰り返し処理し、適切な量 (実際の経過時間、またはティックごとの任意の時間単位) だけ時間をかけて伝播するように指示することです。これらの計算とその後の GUI の更新はすべて、イベント ディスパッチ スレッド上で行われます。
したがって、この計算をできるだけオフロードしたいと思います。s が最適だと思いますSwingWorker
が、それらを既存のコードに組み込む方法がわかりません。SwingWorker
それらの多くはすでに他のクラスを拡張しているため、既存のクラスを拡張することはできません。
これまでの私の最善のアイデアは、実装する時間依存オブジェクトごとにインターフェイスを作成することです。インターフェイスは 2 つのメソッドを指定calcUpdateTime()
しますdrawUpdateTime()
。現在の各updateTime()
方法を、物理計算 ( にcalc_
) と GUI の更新 ( にdraw_
) に分割します。TimeDependant
次に、コンストラクターでオブジェクトを受け取る SwingWorker のクラスを 1 つだけ作成し、それdoInBackground
が を呼び出しcalcUpdateTime
、done
を呼び出しますdrawUpdateTime
。それで、私はすべての出現を置き換えることができます
と
私はこのアイデアを SO で実行したかったのです。なぜなら、それは正しくないと感じたからです。プロジェクト全体をリファクタリングして、私が悪いアイデアから始めたことを知りたくないからです。MySwingWorker
また、ティックごとに潜在的に数十の s を作成するのはおそらく悪い考えではありませんか?
ここまで読んでくれてありがとう。
java - SwingWorkerはネストされたクラスである必要がありますか?
SwingWorker
メインGUI内でネストされたクラスである必要があるかどうか疑問に思っています。GUIをプログラムロジックから明確に保つために、外部クラスにしたいです。
クラスを外部にしようとしましたがSwingWorker
、これはプロセスで正常に機能しますが、残念ながら、SwingWorkerクラスからGUIフィールドにアクセスできません。SwingWorkerのメソッド内からラベルなどの属性にアクセスしようとするとdone()
、nullPointer例外が発生します。
アドバイスをいただければ幸いです。
まずはジェフ、どうもありがとうございました!あなたが提示した2番目のオプションについてはフォローできませんでしたが、これまでのところ正常に機能しています。私のバックグラウンドタスクの1つは、特定のサイズ(長い値)を計算するので、GUIからその値を取得すると便利です。
ゲッターとセッターを使用することを提案しましたが、残念ながら、SwingWorkerクラスでそれらを実装する方法がわかりません。
私はこのようにそれを試しました:
セッターはdoInBackground()
メソッドの最後に呼び出されます。残念ながらget()
、GUIからこのメソッドを使用することはできません。
コンストラクターがRunnableのオブジェクトを必要とするため、私の場合、「w」のオブジェクト作成は機能しません。私は何かが足りないのですか?SwingWorkerを使用するのは初めてです。:)繰り返しになりますが、ご協力いただきありがとうございます。
java - SwingWorker を使用して jTable に行を追加し、GUI を更新する
ボタンがクリックされると、ゼロから始まる数字だけで一度に1行ずつ追加し、1000000行になるまで行を追加し続けるjTableを作成しようとしています。私はSwingWorkerのdoInBackground、publishおよび行カウンターをインクリメントし、各行を追加するメソッドを処理します。これは、行が追加されている間、GUI がフリーズしないことを意味します。ただし、実行すると、行番号が増加するのがわかりますが、1行しか追加されず、その1行が変更され続けます。つまり、1行がテーブルに追加され、その行番号が増加するため、最後に1行になり、以下は私のSwingWorkerコードです。どんなヘルプでも大歓迎です。この問題は私に眠れない夜を与えています!! :/
java - JavaのSwingWorkerでタスクをタイムアウトします
SwingWorker
アプリケーション内にクラスを実装しようとしています。SwingWorkerが「タイムアウト」するまでの時間を設定する方法はありますか?OutOfTime
キャッチして対処できる例外を投げるかもしれないと思っていました。どうやって実装すればいいのかわからない。
ご協力ありがとうございます!