2010-07-29 28 views
6

Tôi đã chuyển sang sử dụng OpenGL thông qua Penumbra để cố gắng vẽ trực tiếp trên JPanel bằng ngữ cảnh Đồ họa của nó. Điều này sẽ là tuyệt vời, ngoại trừ tôi đang gặp một số rắc rối ... Tôi biên dịch mã của tôi, và ~ 1 lần trong số 25, đồ họa (đó là một hình chữ nhật cho ví dụ) vẽ tốt. Người kia ~ 24 lần, nó không.Điều kiện chủng tộc (?) Khi sử dụng Swing

Dưới đây là mã của tôi:

(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))) 

Chức năng draw-line là dưới đây:

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

Tôi không có ý tưởng những gì đang xảy ra. Lúc đầu, tôi nghĩ rằng đó là refs tôi đã làm việc trên, nhưng sau đó tôi đã đưa những người ra, và vẫn còn có những vấn đề này. Tôi cũng đã đặt lại lein và slime/swank và emacs. Tôi khá bối rối.

Như thường lệ, mọi trợ giúp sẽ được đánh giá cao. Tôi hy vọng đây là một câu hỏi với một câu trả lời! Gần đây, tôi dường như đang yêu cầu điều không thể được :)

Trả lời

5

Đảm bảo rằng bạn luôn ở trên EDT. Nếu bạn thấy GUI của mình hoạt động ngẫu nhiên thường là nguyên nhân. Điều kiện cuộc đua là rất quan trọng để xoay vì nó được thiết kế để hoàn toàn đơn luồng.

Những gì bạn có thể thử, chỉ để xem, là tìm bất kỳ phương pháp tương tác với một thành phần swing và có nó in ra Thread.getCurrentThread(). ToString() (hoặc một cái gì đó rất gần đó).

Nó luôn luôn nên in ra một tên chuỗi và bạn sẽ thấy các chữ cái AWT nhúng trong đó một nơi nào đó. Bạn thậm chí có thể lưu trữ chuỗi đó, kiểm tra nó trên mọi cuộc gọi vào Swing và khẳng định nếu nó không giống nhau. Trên thực tế, tôi không biết tại sao Sun không bao giờ xây dựng một phiên bản "Debug" của JDK để khẳng định khi những thứ như thế này xảy ra (như khi một số sợi xích đu được gọi từ một sợi không ...)

+0

Tuyệt vời, cảm ơn bạn! Bất kỳ đề xuất về bắt đầu từ đâu? (Và, cho điểm thưởng, bất kỳ ý tưởng mà tôi có thể đang đi lạc khỏi EDT?) – Isaac

+0

Tôi sợ tôi không biết đủ về khuôn khổ bạn đang sử dụng - Tôi không nhận ra cú pháp ngoại trừ để có thể nói rằng đó là khai báo. Một (gây phiền nhiễu) điều bạn có thể làm là phân lớp tất cả các điều khiển bạn sử dụng, ghi đè lên các phương pháp bạn có thể sử dụng và để chúng xuất ra chuỗi hiện tại. Một khả năng khác là ở phần đầu của đường vẽ, nó in ra tên luồng đó và xem nó có chứa các chữ cái AWT hay không. Sau đó, tôi chỉ không biết đủ về mã của bạn. –

4

Bạn nên ghi đè paintComponent trong bảng điều khiển. (Lựa chọn JPanel có lẽ không phải là tốt nhất - sử dụng JComponent và nhất định set-opaque trên đó.)

Ngoài ra, tôi đoán bạn nên có trên EDT AWT.

Các vấn đề liên quan