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.");
}
}
コンパイル可能な実行可能ファイル[SSCCE](http://sscce.org)を投稿しないと、あなたの推測は私たちよりも優れています。しかし、あなたが本当に私たちのSWAGsではなく私たちの助けを必要とするなら、[SSCCE](http://sscce.org)の作成と掲示を検討してください。あなたは努力を後悔することはありませんし、どちらも私たちはしません。 –
@HovercraftFullOfEelsDone。 – Maxpm
Swing GUIオブジェクトは、[イベントディスパッチスレッド](http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)で_only_を構築し、管理する必要があります。 – trashgod