我已经阅读了很多关于这个问题的答案,但即使是在一个简单的代码上我也无法找到我的错误。问题在于:我想在JPLnel中的JLabel中绘制一个Image,但是JLabel的paintComponent()方法没有被调用。
以下是代码:
ImagePainter类应绘制图像
public class ImagePainter extends JLabel{
private Image image;
public ImagePainter(){
try {
image = ImageIO.read(new File("src/testgui/image.png"));
} catch (IOException exception) {
exception.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(image, 0, 0, null);
System.out.println("in paintComponent");
}
}
这是一个标准的JFrame。我小心地将JPanel添加到contentPane
public class Display extends JFrame{
public Display(){
JPanel jp = new JPanel();
ImagePainter i = new ImagePainter();
getContentPane().add(jp);
jp.add(i);
jp.repaint();
setSize(800, 800);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
最后是主力。我在EDT上实现显示,就像每个人都说的那样:
public class Main {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
@Override
public void run(){
Display d = new Display();
}
});
}
}
最后,我观察到如果我直接将ImagePainter添加到contentPane,则会正确绘制图像。这可能是一个愚蠢的错误,但我花了几个小时试图找到它并且真的无法看到它。提前谢谢!
答案 0 :(得分:2)
当图像是自定义绘制时,标签不考虑图像的首选大小!默认情况下,面板具有流布局。流布局不会拉伸组件以适应。因此该标签的大小为0 x 0像素。您可以通过在标签上添加可见边框来确认。
但鉴于图像显示在标签中,为什么不将图像设置为标签的图标?
答案 1 :(得分:0)
此外,Display构造函数中的text = Regex.Replace(text, @"\([^)]*\)", "");
text = Regex.Replace(text, @"\s{2,}", " ");
语句没用,因为您尚未将框架设置为可见。