我有一个扩展 JLabel 的类,用于在标签的整个内部区域上显示图像。
为了实现这一点,我像这样覆盖paintComponent:
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(image != null) {
SwingUtilities.calculateInnerArea(this, innerArea);
g.drawImage(image, 0, 0, innerArea.width, innerArea.height, this);
}
}
我认为它应该使用构造函数来工作,如下所示:
public ImageLabel(String img) {
super();
this.image = new ImageIcon(this.getClass().getResource(img)).getImage();
repaint();
}
但我有一个问题,标签基本上没有大小,因为它没有实际内容。
当使用 super("");
时,一切看起来都像我实际预期的那样。
现在我想知道 - 这是解决这个问题的合法方法还是我错过了其他(可能更好)的方法?
最佳答案
虽然从技术上讲,您可以在JLabel
上绘画,但最好在JPanel
上绘画。您的代码似乎没问题,只需将其转换为 JPanel
即可。
"But there I have the issue, that the Label has basically no size, since it has no actual content."
绘画时,您也要记住重写getPreferredSize()
。油漆并不是真正的内容,所以没有首选尺寸。它通过传递参数来工作的原因是,您传递给它的字符串是内容,这使得标签的首选大小与您传递给它的字符串相匹配。但就像我说的,使用像这样的 JPanel
public class ImagePanel extends JPanel {
private final int D_W = 400;
private final int D_W = 400;
private BufferedIMage imag;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(D_W, D_H);
}
}
关于java - 强制显示 JLabel 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21401030/