Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制显示JLabel子类_Java_Image_Swing_Jlabel_Subclassing - Fatal编程技术网

Java 强制显示JLabel子类

Java 强制显示JLabel子类,java,image,swing,jlabel,subclassing,Java,Image,Swing,Jlabel,Subclassing,我有一个扩展了JLabel的类,可以在标签的整个内部区域显示图像。 为了实现这一点,我覆盖了以下组件: protected void paintComponent(Graphics g) { super.paintComponent(g); if(image != null) { SwingUtilities.calculateInnerArea(this, innerArea); g.drawImage(image, 0, 0, innerA

我有一个扩展了JLabel的类,可以在标签的整个内部区域显示图像。
为了实现这一点,我覆盖了以下组件:

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);
    }

}
@Override 
public Dimension getPreferredSize() {
    if (isPreferredSizeSet()) {
        return super.getPreferredSize();
    }
    return new Dimension(D_W, D_H);

    // Could also return this, to make the panel's 
    // preferred size match the image size
    //return new Dimension(image.getWidth(this), image.getHeight(this));
}
我认为它应该使用以下构造函数工作:

public ImageLabel(String img) {

    super();
    this.image = new ImageIcon(this.getClass().getResource(img)).getImage();
    repaint();

}
但我有一个问题,标签基本上没有大小,因为它没有实际内容。
使用
super(“”)时相反,一切看起来都和我预期的一样

现在我想知道-这是解决这个问题的合法方法还是我缺少了其他(可能更好的)方法?

虽然从技术上讲,你可以在
JLabel
上画画,但最好是在
JPanel
上画画。您拥有的代码似乎很好,只需将其转换为
JPanel

“但我有一个问题,标签基本上没有大小,因为它没有实际内容。”

绘制时,还需要记住覆盖
getPreferredSize()
。paint不是真正的内容,因此不会有首选大小。它通过传递参数来工作的原因是,传递给它的字符串是内容,这使得标签的首选大小与传递给它的字符串匹配。但是就像我说的,像这样使用
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);
    }
}
虽然从技术上讲,您可以在
JLabel
上绘制,但最好在
JPanel
上绘制。您拥有的代码似乎很好,只需将其转换为
JPanel

“但我有一个问题,标签基本上没有大小,因为它没有实际内容。”

绘制时,还需要记住覆盖
getPreferredSize()
。paint不是真正的内容,因此不会有首选大小。它通过传递参数来工作的原因是,传递给它的字符串是内容,这使得标签的首选大小与传递给它的字符串匹配。但是就像我说的,像这样使用
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);
    }
}
虽然从技术上讲,您可以在
JLabel
上绘制,但最好在
JPanel
上绘制。您拥有的代码似乎很好,只需将其转换为
JPanel

“但我有一个问题,标签基本上没有大小,因为它没有实际内容。”

绘制时,还需要记住覆盖
getPreferredSize()
。paint不是真正的内容,因此不会有首选大小。它通过传递参数来工作的原因是,传递给它的字符串是内容,这使得标签的首选大小与传递给它的字符串匹配。但是就像我说的,像这样使用
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);
    }
}
虽然从技术上讲,您可以在
JLabel
上绘制,但最好在
JPanel
上绘制。您拥有的代码似乎很好,只需将其转换为
JPanel

“但我有一个问题,标签基本上没有大小,因为它没有实际内容。”

绘制时,还需要记住覆盖
getPreferredSize()
。paint不是真正的内容,因此不会有首选大小。它通过传递参数来工作的原因是,传递给它的字符串是内容,这使得标签的首选大小与传递给它的字符串匹配。但是就像我说的,像这样使用
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);
    }
}

peeskillet已经给出了一个恰当的答案()。但是,为了实现通常的行为(即遵守由
组件#setPreferredSize(Dimension)
方法设置的总合同),实际上应该像这样覆盖
getPreferredSize()
方法:

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);
    }

}
@Override 
public Dimension getPreferredSize() {
    if (isPreferredSizeSet()) {
        return super.getPreferredSize();
    }
    return new Dimension(D_W, D_H);

    // Could also return this, to make the panel's 
    // preferred size match the image size
    //return new Dimension(image.getWidth(this), image.getHeight(this));
}

peeskillet已经给出了一个恰当的答案()。但是,为了实现通常的行为(即遵守由
组件#setPreferredSize(Dimension)
方法设置的总合同),实际上应该像这样覆盖
getPreferredSize()
方法:

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);
    }

}
@Override 
public Dimension getPreferredSize() {
    if (isPreferredSizeSet()) {
        return super.getPreferredSize();
    }
    return new Dimension(D_W, D_H);

    // Could also return this, to make the panel's 
    // preferred size match the image size
    //return new Dimension(image.getWidth(this), image.getHeight(this));
}

peeskillet已经给出了一个恰当的答案()。但是,为了实现通常的行为(即遵守由
组件#setPreferredSize(Dimension)
方法设置的总合同),实际上应该像这样覆盖
getPreferredSize()
方法:

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);
    }

}
@Override 
public Dimension getPreferredSize() {
    if (isPreferredSizeSet()) {
        return super.getPreferredSize();
    }
    return new Dimension(D_W, D_H);

    // Could also return this, to make the panel's 
    // preferred size match the image size
    //return new Dimension(image.getWidth(this), image.getHeight(this));
}

peeskillet已经给出了一个恰当的答案()。但是,为了实现通常的行为(即遵守由
组件#setPreferredSize(Dimension)
方法设置的总合同),实际上应该像这样覆盖
getPreferredSize()
方法:

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);
    }

}
@Override 
public Dimension getPreferredSize() {
    if (isPreferredSizeSet()) {
        return super.getPreferredSize();
    }
    return new Dimension(D_W, D_H);

    // Could also return this, to make the panel's 
    // preferred size match the image size
    //return new Dimension(image.getWidth(this), image.getHeight(this));
}

你为什么不直接调用
new JLabel(new ImageIcon(this.getClass().getResource(img)).getImage())
?据我所知,这样图像图标就不会被调整大小了为什么你不直接调用
new JLabel(new ImageIcon(this.getClass().getResource(img)).getImage())
?据我所知,这样图像图标就不会被调整大小了为什么你不简单地调用
newjlabel(newimageicon(this.getClass().getResource(img)).getImage())
?据我所知,这样图像图标就不会被调整大小了为什么你不简单地调用
newjlabel(newimageicon(this.getClass().getResource(img)).getImage())
?据我所知,这样图像图标就不会被调整大小了,所以我至少走对了路,谢谢你让这更清楚!所以我至少走对了路,谢谢你让我说得更清楚!所以我至少走对了路,谢谢你让我说得更清楚!所以我至少走对了路,谢谢你让我说得更清楚!