6

Penumbra を介して OpenGL を使用しようとすることから、Graphics コンテキストを使用して JPanel に直接描画しようとすることに移りました。

問題が発生していることを除けば、これは素晴らしいことです...コードをコンパイルすると、25回に1回、グラフィック(例では長方形)がうまく描画されます。他の〜24回はそうではありません。

これが私のコードです:

(def main
  (let [frame (JFrame. "This is a test.")
        main-panel (JPanel. (GridBagLayout.))
        tpan (proxy [JPanel] [] (getPreferredSize [] (Dimension. 600 400)))]

    (doto frame
      (set-content-pane
       (doto main-panel
         (grid-bag-layout
          :gridx 0 :gridy 0
          tpan
          :gridx 0 :gridy 1
          xy-label)))
      (pack-frame)
      (set-visible))

    (draw-line tpan Color/RED 250 250 50 50)))

機能draw-lineは以下です。

(defn draw-line [panel color x y w h]
  (let [graphics (.getGraphics panel)]
    (doto graphics
      (.setColor color)
      (.drawRect x y w h))))

何が起こっているのかわかりません。最初は私が取り組んでいる参照だと思っていましたが、それらを削除しましたが、まだこれらの問題があります. lein と slime/swank と emacs もリセットしました。私はかなり困惑しています。

いつものように、助けていただければ幸いです。これが答えのある質問であることを願っています!最近、私は不可能を求めているようです:)

4

2 に答える 2

5

常にEDTを使用していることを確認してください。GUIがランダムに動作している場合は、それが一般的な原因です。完全にシングルスレッドになるように設計されているため、競合状態はスイングにとって重要です。

見ているだけで、swingコンポーネントと相互作用するメソッドを見つけて、Thread.getCurrentThread()。toString()(またはそれに非常に近いもの)を出力することができます。

常にスレッド名を出力する必要があり、どこかにAWTという文字が埋め込まれているのがわかります。そのスレッドを保存し、Swingを呼び出すたびにそれに対してテストし、同じでない場合はアサートすることもできます。

実際、Sunがこのようなことが起こったときにアサートするJDKの「デバッグ」バージョンを構築しなかった理由はわかりません(たとえば、awt以外のスレッドからスイングスレッドが呼び出されたときなど)。

于 2010-07-29T21:25:25.277 に答える
4

paintComponentパネルでオーバーライドする必要があります。(の選択はJPanelおそらく最善ではありません - 使用JComponentして確実set-opaqueに使用してください。)

また、AWT EDT を使用する必要があると思います。

于 2010-07-29T21:19:20.853 に答える