2017-10-18 84 views
4

我有一個java應用程序,運行在ubuntu 16.04上,使用jre 1.7,我得到了一些渲染問題。下面的代碼不是應用程序代碼,而是一個簡單的測試用例。java swing中的渲染問題

import javax.swing.JComboBox; 
import javax.swing.JFrame; 

public class Test { 


    public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    f.setSize(400,200); 

    String[] s = {"test", "of", "rendering"}; 
    JComboBox<String> cs = new JComboBox<>(s); 
    f.add(cs); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.pack(); 
    f.setVisible(true); 

    } 
} 

下圖顯示了此問題:我在JComboBox中3個元素,但是當我瀏覽(通過鼠標或鍵盤)的元素改變顯示(這不應該發生)。這個問題也發生在Jtree元素中。 enter image description here

對此問題有任何想法。 在此先感謝。

+2

1.您是顯示上面列出的簡單案例的輸出結果? (因爲我想知道,儘管你是一個簡單的例子,你的原始代碼中還有其他的東西沒有在這個例子中被捕獲到)。 2.這隻有在JFrame很小時纔會發生? –

+2

1)應該在EDT上啓動Java Swing/AWT GUI。 2)'f.pack();'應該被保留下來,但是它使得早期的'f.setSize(400,200)''不相關。 –

+0

這是什麼樣的感覺? – Obicere

回答

2

我有同樣的問題,因爲你,我設法通過甲骨文的Java JDK 7,而不是的OpenJDK 7這似乎是具有上述問題擺脫這種頗爲憤怒的bug。

對我來說,只需將鼠標懸停在JComboBox的不同選擇上即可。我沒有使用Windows的這個問題,所以我認爲Java JDK的切換版本可能會給出不同的結果。

該錯誤可能位於OpenJDK中Swing重繪函數內部某處,因爲重繪似乎是在錯誤的線程中執行的。 通過擴展RepaintManager類覆蓋addDirtyRegion(JComponent c, int x, int y, int w, int h)與添加打印出java.awt.EventQueue.isDispatchThread()我可以檢查重新繪製過程中使用的線程。

上述功能使用Oracle JDK時使用的OpenJDK但真正JComboBox內徘徊時返回多次。我希望比我聰明的人可以精確地查明錯誤並報告錯誤,因爲我沒有時間計算它或者在JDK實現之間進行源代碼比較。

P.S.目前在使用APT的Ubuntu上安裝Oracle JDK 7時似乎存在問題,所以我下載了RPM軟件包,使用此方法將其轉換爲使用外星人的deb軟件包 - Oracle Java JDK 7 on Ubuntu Linux - Source or RPM Installation