問題タブ [edt]
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.
unix - Unix または PC 用の VMS エディター EDT のフリーウェアのクローンは?
頻繁に使用するすべてのプラットフォームで同じエディターを使用できるようにしたいと考えています。
Emacs と Vi は望ましいソリューションではありません。
java - そもそもなぜ EventDispatchThread なのか?
これは私が理解できない設計上の決定です。
Android と JME はどちらも、アプリを開始したスレッドが UI スレッドであり、リソースを消費するものを別のスレッドにオフロードするように注意するというポリシーに従います。
一方、Swing では、EventQueue.invokeLater(Runnable)
UI とSwingWorker
バックグラウンド処理に使用します。
さて、メインスレッドは何ですか?
java - アクティブ レンダリングと EDT (スイング アニメーション)
Swing アプレットでアニメーションを実行するにはどうすればよいですか?
アクティブなレンダリングを実行するアニメーション スレッドがあり、最初は正常にアニメーション化されます。ときどき (1 分から 2 時間後まで) 画面の更新に失敗し始め、音だけが発生します。これは、ペイントが EDT から実行されず、何らかの同時実行性の問題が発生したためだと思います。
では、アクティブなレンダリング (つまり、getGraphics() とペイント) は EDT からのみ呼び出す必要がありますか? これに関する問題は、Swing タイマーの精度が不足していることです。
または、EDT を使用せずにアクティブ レンダリングに成功し、ページへの EDT 更新を完全に無効にした人はいますか (おそらく Canvas を使用するか、JPanel で再描画を無視します)。
java - 複雑なクラス相互作用のための Java Swing 設計パターン
複数のサブシステムを持つ Java スイング アプリケーションを開発しています。すべての意図と目的のために、ランダムな追加機能を備えたインターネット チャット プログラムを作成していると仮定しましょう。その機能は... 時間を設定してその時間にリマインダーを受け取ることができるスケジューラーであり、リマインダーを受け取ったことを友達リストの全員に通知することもできます。
この機能を GUI、ChatManager、および Scheduler の 3 つのクラスに編成することは理にかなっています。これらのクラスは次のことを行います。
GUI - すべての Swing コンポーネントとイベントを定義します
ChatManager - チャット接続の作成、メッセージの送受信、フレンド リストの管理
スケジューラ- システム時間の監視、通知の送信、セッション間のイベントを記憶するためのファイルの保存
プログラムが機能するには、これらの各クラスが他の 2 つのクラスと通信できる必要があります。GUI は、いつメッセージを送信するかを ChatManager に通知し、いつ監視を開始するかを Scheduler に通知する必要があります。ChatManager は、受信したメッセージを GUI に表示する必要があります。最後に、Scheduler は、完了時に GUI に通知し、ステータスの更新などを ChatManager に送信する必要があります。
もちろん、ここで説明するクラスはすべて非常に単純であり、相互に直接通信できるようにすることも悪くないかもしれません。ただし、この質問のために、相互作用がはるかに複雑であると仮定しましょう。
たとえば、特定の時刻ではなく、特定のイベントをスケジューラに登録できるとします。メッセージを送信するときは、メッセージをユーザーに送信し、ログ ファイルに保存し、イベント オブジェクトを作成してスケジューラに渡し、途中でスローされる可能性のある例外を処理しました。
通信がこれほど複雑になると、これらのクラスとの通信がさまざまな場所で発生する可能性がある場合、コードの保守が難しくなります。たとえば、ChatManager をリファクタリングする場合、GUI とスケジューラの両方に大幅な変更を加える必要があるかもしれません (何か新しいものを導入する場合は、それ以外にも)。これにより、コードの保守が難しくなり、睡眠不足のプログラマーが変更を加えるときにバグが発生する可能性が高くなります。
最初は最も理にかなっているように見えた解決策は、メディエーター デザイン パターンを使用することです。これら 3 つの主要なクラスは、互いに直接認識しておらず、代わりにそれぞれがメディエーター クラスを認識しているという考え方です。次に、メディエータ クラスは、3 つのクラス間の通信を処理するメソッドを定義します。したがって、たとえば、GUI はメディエーター クラスの sendMessage() メソッドを呼び出し、メディエーターは必要なすべての処理を行います。最終的に、これにより 3 つの主要なクラスが分離され、そのうちの 1 つを変更すると、メディエーターが変更されるだけになる可能性があります。
しかし、これには 2 つの主な問題があり、最終的にはフィードバックを求めてここに来ました。それらは次のとおりです。
問題
多くのタスクで GUI を更新する必要がありますが、メディエーターはコンポーネントを認識していません。- ユーザーがプログラムを起動し、ユーザー名とパスワードを入力し、[ログイン] をクリックしてチャット サーバーにログインするとします。ログイン中に、「接続中...」、「ログイン中...」、「エラー」などのテキストをログイン画面に表示して、ログインプロセスを報告したい。Mediator クラスでログイン メソッドを定義する場合、これらの通知を表示する唯一の方法は、正しい JLabel を更新するパブリック メソッドを GUI クラスで作成することです。最終的に、GUI クラスには、特定のユーザーからのメッセージの表示、ユーザーのログオン/オフ時のフレンド リストの更新など、そのコンポーネントを更新するための非常に大量のメソッドが必要になります。また、これらの GUI の更新はいつでもランダムに発生する可能性があることを予期する必要があります。それは大丈夫ですか?
Swing イベント ディスパッチ スレッド。ほとんどの場合、EDT で実行されるコンポーネント ActionListeners からメディエーター メソッドを呼び出します。ただし、EDT でメッセージを送信したり、ファイルを読み書きしたりしたくない場合は、GUI が応答しなくなります。したがって、SingleThreadExecutor をメディエーター オブジェクトで使用可能にし、メディエーター オブジェクトのすべてのメソッドで、エグゼキューター スレッドに送信できる新しい実行可能ファイルを定義することは良い考えでしょうか? また、GUI コンポーネントの更新は EDT で行う必要がありますが、その Executor スレッドはメソッドを呼び出して GUI コンポーネントを更新します。したがって、GUI クラスのすべてのパブリック メソッドは、実行のために EDT に送信する必要があります。それは必要ですか?
私には、外部と通信するすべてのコンポーネントを更新するためのメソッドを GUI クラスに用意するのは大変な作業のように思えます。これらの各メソッドには、EDT 上にあるかどうかをチェックし、自分自身を追加する追加のオーバーヘッドがあります。それ以外の場合は EDT。さらに、Mediator クラスのすべての public メソッドは、Runnable コードを Mediator スレッドに追加するか、ワーカー スレッドを起動するなど、同様のことを行う必要があります。
全体として、Mediator パターンを使用してアプリケーションを維持することは、それを使用せずにアプリケーションを維持することとほぼ同じくらいの作業のように思えます。では、この例では、何か違うとしたら何をしますか?
java - Swing: 非表示のフレームのラベルを変更してからフレームを表示すると、EDT では逆の順序で発生します
問題
Swing でダイアログ ボックスを作成します (JRE 6 update 10、Ubuntu Linux)。ユーザーがダイアログ ボックスの使用を終了すると、ダイアログ ボックスは非表示になります。ユーザーが別のフレームのボタンをクリックすると、ボックスのラベルがボタンに応じて変更され、ボックスが再び表示されます。
私が抱えている問題は、プログラム的には逆の順序で呼び出しを行っているにもかかわらず、ラベルが変更される前にボックスが表示されることです。これにより、ボックスが表示され、続いてラベルが変更され、低速のターゲット HW では「グリッチ」に見えます。EDT はフレームsetVisible(true)をラベルsetText(....)の前にスケジュールしているようです。この呼び出しを優先します。setText(....)の後にsetVisible(true)を実行するように EDT をスケジュールする方法はありますか?
コードは EDT で既に実行されているボタン クリックから呼び出されるため、 SwingUtilities.invokeAndWaitを使用できないことに注意してください。invokeLaterメソッドを使用してみましたが、EDT はまだそれを再スケジュールします。
再現するには
IDE で次のコードをデバッグ モードで実行し、「ダイアログ」フレームを表示および非表示にした後、 showButtonのアクション コードを中断します。ラベルのsetText(....)の変更は GUI にすぐには影響しませんが、フレームのsetVisible(true)は影響します。次に、EDT をステップ実行すると、 setTextが最終的に EDT スケジュールのさらに下で発生することがわかります。
java - イベントディスパッチスレッドはJavaメモリモデルに適合しています
これは、私が以前に尋ねた質問に関連しています。答えは次のとおりです。
フィールドが複数のスレッドによってアクセスされる場合、そのフィールドは揮発性または最終的であるか、同期されたブロックでのみアクセスされる必要があります。そうしないと、割り当てられた値が他のスレッドに表示されない場合があります。
さらに、画面上のピクセルを操作するものはすべて、イベントディスパッチスレッドから実行する必要がありますが、これはrepaint/paintを使用すると透過的に処理されます。
したがって、私の理解では、画面上を移動するスプライトのアニメーションのような単純なもののメモリモデルについて心配する必要があります。
私の質問は、この理解は正しく、Sunのチュートリアルの例( TumbleItem(ソース)など)は正しくないかということです。
java - EDTをブロックせずにEDTでオブジェクトが作成されるのを待つ方法は?
イベントディスパッチスレッドから呼び出され、完全に初期化されたUIコンポーネントを返す必要があるJavaライブラリでAPIを使用しています。次のようになります。
ただし、データベースからロードした後にのみダイアログにデータを入力できます。これには10秒かかる場合があります。通常はバックグラウンドスレッドでこれを行いますが、このメソッドはEDTから呼び出され、ダイアログを返す必要があるため、機能しません。これはサードパーティのライブラリなので、メソッドを変更することはできませんが、EDTのブロックを回避するためにできることはありますか?
java - TreeSet の動作がおかしい
TreeSet ( sortedNodes
) と ArrayList ( nodes
) で奇妙な問題が発生しています。私のプログラムでは、Event Dispatch Thread (from ActionListener
) から呼び出されるメソッドに次の行があります。
問題は、一部のコレクションでsortedNodes.size()
より低い数値を返すことですnodes.size()
(これらの 3 行では、の内容に変更はありませんnodes
)。のコンテンツを印刷するとsortedNodes
、必要なすべてのオブジェクトが含まれていないだけでなく、ソートされていません。奇妙なことに、メソッド全体を再度呼び出すと、問題が修正されます。わかりません-同じコレクションで同じコードが実行されますが、最初は機能せず、2回目は機能します。何か案は?
編集:私の問題があまり明確でない場合、これが役立つはずです
これを出力すると、次のようになります。
コンパレータ:
ノード:
メソッド全体:
また、プログラムを変更したので、NodeShape を作成/削除するたびに、Node が新しいコレクションに追加/削除され、この新しいコレクションを nodeShapes の代わりに exportTree() で使用しましたが、同じように動作するため、nodeShapes に問題はありません. それはただのTreeSetです..私がそれを使用しない場合、すべてが正常に機能します(ただし、ノードがソートされません)。
java - Swing で JLabel をリフレッシュする際の問題 (どうやらイベント ディスパッチ スレッドで)
私はこのアクションリスナーを持っています:
}
refreshScreen() が機能していないようです。それらは明らかにイベント ディスパッチャー スレッドで実行されており、加えられた変更はアクション リスナーの実行が終了したときにのみ表示されます。EDT 上にないため、MokkiGUI() コンストラクターから呼び出すと正常に動作します。
java - 外部ソフトウェアで EDT 違反により NullPointerException が発生する可能性はありますか?
最近別の Java ソフトウェア (「外部」ソフトウェアと呼びます) に統合された Java ソフトウェアがあります。2 つのソフトウェア間の「通信」には、リスナーとコールバック メカニズムを使用します。
「外部」ソフトウェアの作成者は、私のコードに EDT 違反があるために NullPointerException が発生したと言っています。それは本当ですか?