Java 强制显示JLabel子类
我有一个扩展了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
为了实现这一点,我覆盖了以下组件:
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())
?据我所知,这样图像图标就不会被调整大小了,所以我至少走对了路,谢谢你让这更清楚!所以我至少走对了路,谢谢你让我说得更清楚!所以我至少走对了路,谢谢你让我说得更清楚!所以我至少走对了路,谢谢你让我说得更清楚!