我已经制作了一个自定义子类JLabel
。我有一个这样的实例,在一个单一的JPanel
内部,一个单一的内部JFrame
。我不覆盖该paintComponent()
方法;该类所做的只是在光标悬停在其上时更改背景颜色。
立即加载,JFrame
但有几秒钟JPanel
未绘制。paintComponent()
我通过覆盖和添加一些调试println()
语句来验证这是因为我的自定义类。
public void paintComponent(Graphics context)
{
System.out.println("Painting...");
super.paintComponent(context);
System.out.println("Painted.");
}
奇怪的是,当我使用Panel
代替JPanel
或Label
代替时,它会立即绘制出来JLabel
。
这种滞后来自哪里?
编辑:一些示例代码。实际上没有绘制任何内容;查看控制台消息延迟。
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.");
}
}