問題タブ [repaintmanager]
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 - PaintComponent Java 遅い
私は自分の Mac で Java アプリケーションを開発しています。ロジックは次のとおりです。
- サーバーがクライアント アプリケーションに、基本的な形状を描画するためのいくつかの命令を送信します。
- クライアント アプリケーションは、基本的な形状を Jpanel に描画します。
Shape が到着するたびに、プログラムは repaint() を呼び出します。
すべてがスムーズに (リアルタイムで) 動作するので、同じアプリケーションを Windows コンピューターでテストすることにしました。その結果、アプリケーションが遅延します。以上が私がたどり着いた結論です。
- RepaintManager は repaint() 呼び出しを蓄積しています。形状が目的地に到着する様子はわかりますが、場合によっては 5 回以上の再描画呼び出しが 1 つに蓄積され、アプリケーションが非常に遅れたり、リアルタイムではなくなります。
形状が到着するたびに再描画を呼び出す代わりに、タイマーで数ミリ秒ごとに再描画を試みましたが、結果は同じです。コード :
さらに、マウスでペイントできるランダムなコードをいくつかテストしました。これは、paintComponent を使用したロジックと同じです。この場合、ラグ感なくスムーズに動作します....例: http://javagraphics.blogspot.com.es/2010/06/shapes-implementing-freehand-pencil.html
私の Windows コンピュータ (同じ Jar) で paintComponent が非常に遅い理由がわかりません。プログラムのパフォーマンスに影響を与える可能性のあるものは何ですか?
ペイント コンポーネントに関するすべての回答を読みましたが、いずれもこの問題を解決しました。
問題を解決し、実際にリアルタイムでアーカイブする方法について何かアドバイスはありますか?
前もって感謝します
ビデオの更新:
Mac ビデオ: https://youtu.be/OhNXdGXoQpkリアルタイム 高負荷を処理しても問題ありません
Windows ビデオhttps://youtu.be/yol2miHudZc明らかにラグ
低クオリティで申し訳ありません
BufferedImage を更新します。
BufferedImage を導入した後も、結果はまだ遅い描画アプリケーションです。注文の1つはすべての形状を削除することであるため、別の問題が発生します。次のことを行う必要があるため、複雑さが増します。
HW/OS/Javaバージョン
ウィンドウズ
- プロセッサー i5-4300u 2.5GHz
- ラム12GB
- Java バージョン 1.7.0_71
マック
- プロセッサー i7 2.9GHz
- ラム8GB
- Java バージョン 1.7.0_67
Java VisualVM
ライブ VisualVM のビデオ: https://youtu.be/cRNX4b3rlZk
ラグが発生する理由を説明できる奇妙なことは何も見当たりませんが、私は専門家ではありません(これも低品質で申し訳ありません)
ご回答ありがとうございました
java - Java paintDirtyRegions エラー (NullPointerException)
CardLayout のカードをゲーム JPanel から gameOver JPanel に切り替えようとしています。画面を切り替える代わりに、ゲームがクラッシュします。事前にご提案いただきありがとうございます。
私のゲームコード:
私のウィンドウコード(CardLayoutをgameOver JPanelに切り替えるとエラーが発生するようです):
私が得るエラーは以下の通りです:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Game.paint(Game.java:59)
at javax.swing.JComponent._paintImmediately(JComponent.java:5106)
at javax.swing.JComponent.paintImmediately(JComponent.java:4890)
at javax.swing.RepaintManager$3.run(RepaintManager.java:814)
at javax.swing.RepaintManager$3.run(RepaintManager.java:802)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:802)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:745)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:725)
at javax.swing.RepaintManager.access$1000(RepaintManager.java:46)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1680)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:715)
at java.awt.EventQueue.access$400(EventQueue.java:82)
at java.awt.EventQueue$2.run(EventQueue.java:676)
at java.awt.EventQueue$2.run(EventQueue.java:674)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:685)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
java - java.lang.IndexOutOfBoundsException: インデックス: 1、サイズ: Jidesoft DocumentPane の 1
Edit3:これは一般的な「コードに indexoutofboundsexception があります」という質問を複製しません。回答で明確に述べられているように、広く使用されているサードパーティ ライブラリのバグであり、jide-common
開発者によって確認されているため、以下のリンクがあります。このバグは最近 (この質問の公開後) 修正され、ライブラリの多くの古いバージョンはまだ影響を受けています。したがって、この情報は、jide-common で同じ問題に出くわした他の開発者に役立つ可能性があります。
Java での GUI プログラミングの問題に直面しています。問題の特定の原因についてはわかりません (まだ把握できていません)。どこかでエラーが発生したか、jide コンポーネントのコードに問題があるか、awt/swing フォーカスまたはイベント処理に何か問題がある可能性があります。
次のコードは、
- com.jidesoft:jide-grids:3.5.1
- com.jidesoft:jide-コンポーネント:3.5.1
- com.jidesoft:jide-common:3.5.1
私はStackoverflow でこのヒントを見つけましたが、いくつかのデバッグの後、CellEditor およびその他のコンポーネントへのすべての変更は EDT で行われるようです。
バグを再現するには、この例を実行し、CellEditor を含むタブを開き (行の最後にある必要があります。そうしないと、インデックス オーバーフローが発生しません)、そこに「正しくない」値を入力し、エディターからフォーカスを削除せずに、[閉じる] をクリックします。前のタブのいずれかの「x」ボタン。その後、次の一連のイベントが発生します: 1) タブが閉じられる/削除される、2) CellEditor ベリファイアがモーダル ダイアログを表示し、タブ ペインの再描画がトリガーされる 3) タブが見つからない (閉じられている) ため、ArrayIndexOutOfBounds 例外がスローされます。
例外:
少しのデバッグ情報が追加された「拡張」バージョンのコードがあります。修正については言及せずに、問題の原因を突き止めることさえできません。前もって感謝します。
編集:ドキュメントによると、 verify() メソッド内からダイアログを表示するのは間違っているということです。
verify メソッドは、入力が有効かどうかを判断するためだけに存在し、ダイアログ ボックスを表示したり、その他の副作用を引き起こしたりすることはありません。shouldYieldFocus メソッドは verify を呼び出し、値が無効な場合は最小値または最大値に設定します。shouldYieldFocus メソッドは、副作用を引き起こすことが許可されています...
そこで、実際に検証していないすべてのコードを shouldYieldFocus() に移動しました。それは問題を解決しませんでしたが、SwingUtilities.invokeLater() で dialog.show() をさらに遅らせることはうまくいくようで、落とし穴はありません... まだ.
Edit2: キャプチャしたビデオを含む gif
java - Java repaint() がアプレットで paint() を呼び出さない
明確にするために、私は現在5時間以上調査しており、関連するすべての質問と20を超えるGoogle検索を読みましたが、どれも役に立たず、私のケースを具体的に説明していません.
まず第一に、ここに私のコードがあります:
私の問題は、ペイントメソッドを呼び出さない再ペイントメソッドです。より具体的には、別のスレッドから repaint を呼び出した場合、または paint メソッドを子クラスに追加して repaint を呼び出した場合に、paint メソッドが実行されますが、アプレットのメイン スレッドから直接呼び出すコードでは機能しません。 . HEEEEELPしてください、私は疲れています