使用Swing时的竞争条件(?)

时间:2010-07-29 21:01:54

标签: java swing clojure race-condition

我已经尝试使用OpenGL通过Penumbra尝试使用其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。我很困惑。

像往常一样,任何帮助将不胜感激。我希望这是一个有答案的问题!最近,我似乎在问不可能的事情:)

2 个答案:

答案 0 :(得分:5)

确保您始终在美国东部时间。如果你看到你的GUI随机起作用通常是原因。比赛条件对摆动至关重要,因为它的设计完全是单线程的。

你可能会尝试,只是为了看,找到任何与swing组件交互的方法,并让它打印出Thread.getCurrentThread()。toString()(或非常接近的那个)。

它应该总是打印出一个线程名称,你会看到某处嵌入字母AWT。您甚至可以存储该线程,在每次调用Swing时对其进行测试,并断言它是否不相同。

实际上我不知道为什么Sun从来没有构建JDK的“调试”版本,当这样的事情发生时会断言(就像从一个非awt线程中调用一些swing线程一样......)

答案 1 :(得分:4)

您应该在面板中覆盖paintComponent。 (选择JPanel可能不是最好的 - 使用JComponent和某些set-opaque就可以了。)

另外,我猜你应该参加AWT EDT。