2011-12-02 16 views
0

JLabelのカスタムサブクラスを作成しました。私は単一のJPanelの中で、単一のJFrameの中にこのインスタンスを持っています。私はではなく、paintComponent()メソッドを無効にします;;すべてのクラスは、カーソルがその上に置かれたときに背景色を変更します。カスタムSwingラベルの初期化に時間がかかりすぎるのはなぜですか?

JFrameはすぐにロードされますが、数秒間はJPanelが引き出されません。私はこれが私のカスタムクラスのためにpaintComponent()をオーバーライドし、デバッグprintln()ステートメントを追加していることを確認しました。

public void paintComponent(Graphics context) 
{ 
    System.out.println("Painting..."); 
    super.paintComponent(context); 
    System.out.println("Painted."); 
} 

奇妙なことは、私はPanelの代わりに、JPanelまたはLabelの代わりJLabelを使用する場合、それが瞬時に描かれています、です。

このラグはどこから来ていますか?

EDIT:いくつかのコード例。実際に描画されるものはありません。コンソールメッセージの遅延を見てください。

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseEvent; 
import java.awt.GridLayout; 
import javax.swing.JPanel; 

public class Example extends JLabel implements MouseListener 
{ 
    private static final long serialVersionUID = 0; 

    public Example() 
    { 
     super(); 
     System.out.println("Constructed."); 
    } 

    public void paintComponent(java.awt.Graphics g) 
    { 
     System.out.println("Painting component..."); 
     super.paintComponent(g); 
     System.out.println("Painted."); 
    } 

    public void mouseEntered(MouseEvent event) { } 
    public void mouseExited(MouseEvent event) { } 
    public void mouseReleased(MouseEvent event) { } 
    public void mousePressed(MouseEvent event) { } 
    public void mouseClicked(MouseEvent event) { } 

    public static void main(final String[] arguments) 
    { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(1, 1)); 
     panel.add(new Example()); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.add(panel); 
     frame.setVisible(true); 
     System.out.println("Set visible."); 
    } 
} 
+3

コンパイル可能な実行可能ファイル[SSCCE](http://sscce.org)を投稿しないと、あなたの推測は私たちよりも優れています。しかし、あなたが本当に私たちのSWAGsではなく私たちの助けを必要とするなら、[SSCCE](http://sscce.org)の作成と掲示を検討してください。あなたは努力を後悔することはありませんし、どちらも私たちはしません。 –

+0

@HovercraftFullOfEelsDone。 – Maxpm

+0

Swing GUIオブジェクトは、[イベントディスパッチスレッド](http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)で_only_を構築し、管理する必要があります。 – trashgod

答えて

3

私のコードは遅れていません:

マイSSCCE:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class LabelTest extends JPanel { 
    public LabelTest() { 
     add(new MyLabel("Fubar!")); 
    } 

    private static void createAndShowGui() { 
     LabelTest mainPanel = new LabelTest(); 

     JFrame frame = new JFrame("LabelTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

@SuppressWarnings("serial") 
class MyLabel extends JLabel { 
    private static final Color BACKGROUND_DEFAULT = new Color(200, 200, 255); 
    private static final Color BACKGROUND_MOUSEOVER = new Color(255, 200, 200); 
    private static final int PREF_W = 200; 
    private static final int PREF_H = 100; 

    public MyLabel(String text) { 
     super(text, SwingConstants.CENTER); 
     setOpaque(true); 
     setBackground(BACKGROUND_DEFAULT); 
     addMouseListener(new MouseAdapter() { 

     @Override 
     public void mouseEntered(MouseEvent arg0) { 
      setBackground(BACKGROUND_MOUSEOVER); 
     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      setBackground(BACKGROUND_DEFAULT); 
     } 

     }); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     int width = Math.max(super.getPreferredSize().width, PREF_W); 
     int height = Math.max(super.getPreferredSize().height, PREF_H); 
     return new Dimension(width, height); 
    } 
} 

この問題はのMouseListenerを経由して、背景の変更のJLabelの概念ではないことを私に示唆むしろあなたのコードのどこかにバグがあります。どこ?私が上に掲示したようなコンパイル可能な実行可能コード(SSCCE)を投稿するまで誰が知っていますか?

+0

-1、それはかなり役に立たない答えだからです。それはSSCCEを使用するためのリマインダとして機能しますが、私はあなたのSSCCEをまとめる途中で、あなたのコメント後にこれを文字通り投稿しました。 – Maxpm

+0

@Maxpm動作しますか? –

+0

@Andrew Mine?はい。 (つまり、問題を示しています) – Maxpm

関連する問題