Java repaint() 不调用 paintComponent() 来绘制图像
Java repaint() doesn't call paintComponent() for drawing image
我已经阅读了很多关于这个问题的答案,但即使是在简单的代码上我也无法找到我的错误。问题是:我想在 JPanel 中的 JLabel 中绘制图像,但未调用 JLabel 的 paintComponent() 方法。
这是代码:
ImagePainter class 应该绘制图像
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 x 0 像素。您可以通过向标签添加可见边框来确认这一点。
但是既然图像显示在标签中,为什么不直接将图像设置为标签的图标呢?
此外,Display 构造函数中的 jp.repaint()
语句没有用,因为您尚未将框架设置为可见。
我已经阅读了很多关于这个问题的答案,但即使是在简单的代码上我也无法找到我的错误。问题是:我想在 JPanel 中的 JLabel 中绘制图像,但未调用 JLabel 的 paintComponent() 方法。
这是代码:
ImagePainter class 应该绘制图像
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 x 0 像素。您可以通过向标签添加可见边框来确认这一点。
但是既然图像显示在标签中,为什么不直接将图像设置为标签的图标呢?
此外,Display 构造函数中的 jp.repaint()
语句没有用,因为您尚未将框架设置为可见。