2017-10-18 3 views
4

jre 1.7を使用しているubuntu 16.04で動作するGUIを持つJavaアプリケーションがあり、レンダリングの問題があります。次のコードはアプリケーションコードではなく、簡単なテストケースです。 Javaスイングでのレンダリングの問題

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

私はあなたと同じ問題を抱えていた、と私は上記の問題を持っているように思われた7代わりのOpenJDKの7オラクルのJava JDKを使用して、このかなり刺激性のバグを取り除くことができました。

私の問題は、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

関連する問題