java - 强制显示 JLabel 子类

标签 java image swing jlabel subclassing

我有一个扩展 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/

相关文章:

java - 鼠标监听器只有一个实例有效

java - 如何同时打开两个JFrame?

java - 在 Java HttpServer 响应中设置内容类型

java - 从嵌套列表中获取最大值并使用流转换为一个列表

c# - 添加到图像的文本在边缘被切断

javascript - 如何使用javascript获取base64编码图像的地址

java - 什么是开始键?

Java 字符串 - 按空格分割,但保留双倍空格

java - 有没有办法在没有 AsyncPlayerChatEvent 的情况下捕获玩家聊天输入?

Android camera2 : java. lang.IllegalStateException : maxImages (1) has already been acquired, 在获取更多之前调用#close