JPanel paintComponent(...) 不起作用
JPanel paintComponent(...) doesnt work
我的问题很容易解释:我想要 a/some 添加到 JFrame 的 JPanels 用图像绘制它们自己。可悲的是,最后一件事不起作用。信息:图像路径正确,JPanel 大小与图像大小相同。
感谢帮助:P
package frames;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import world.Terrain;
public class PanelTerrain extends JPanel {
private Image img;
private int x;
private int y;
private Image imga;
public PanelTerrain(Terrain terra, int x, int y) {
imga = new ImageIcon(terra.getPath()).getImage();
this.x = x;
this.y = y;
this.setBounds(x, y, 8, 8);
//this.setBackground(terra.getColor());
}
public void changeTerrain(Terrain t)
{
this.setVisible(false);
this.setBackground(t.getColor());
this.setVisible(true);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(imga, x, y, this);
}
}
我的第一个猜测是你传错了x
和y.
g.drawImage
中的x
和y
是坐标左上角,不是图像的大小,所以通常直接设置为0(即g.draWimage(imga, x, y, this)
.
一个非常大的问题是您可能会误用边界以及 x 和 y。您在 JPanel 上调用 setBounds(应避免),但随后在某个 x 和 y 处绘制图像,这很可能超出 JPanel 的边界大小。不要这样做。如需更完整的帮助,请创建并 post 您的 Minimal, Complete, and Verifiable example.
这是我认为您应该改为做的事情 -- 假设您想要一个图像网格,其中一些是地球、一些是水、一些是草……
- 为基本图像创建 ImageIcons,一个 Icon 用于草,一个 Icon 用于水等...
- 创建一个使用 GridLayout 的 JPanel,并用 JLabel 网格填充它。
- 将相同的 JLabel 放在 JLabel 的二维数组中。
- 通过在 JLabel 上调用
setIcon(newIcon)
,在需要更改图像的位置和时间交换标签图标。
例如,请参阅 this answer of mine to a similar question 以及同一问题的其他答案。
我的问题很容易解释:我想要 a/some 添加到 JFrame 的 JPanels 用图像绘制它们自己。可悲的是,最后一件事不起作用。信息:图像路径正确,JPanel 大小与图像大小相同。 感谢帮助:P
package frames;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import world.Terrain;
public class PanelTerrain extends JPanel {
private Image img;
private int x;
private int y;
private Image imga;
public PanelTerrain(Terrain terra, int x, int y) {
imga = new ImageIcon(terra.getPath()).getImage();
this.x = x;
this.y = y;
this.setBounds(x, y, 8, 8);
//this.setBackground(terra.getColor());
}
public void changeTerrain(Terrain t)
{
this.setVisible(false);
this.setBackground(t.getColor());
this.setVisible(true);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(imga, x, y, this);
}
}
我的第一个猜测是你传错了x
和y.
g.drawImage
中的x
和y
是坐标左上角,不是图像的大小,所以通常直接设置为0(即g.draWimage(imga, x, y, this)
.
一个非常大的问题是您可能会误用边界以及 x 和 y。您在 JPanel 上调用 setBounds(应避免),但随后在某个 x 和 y 处绘制图像,这很可能超出 JPanel 的边界大小。不要这样做。如需更完整的帮助,请创建并 post 您的 Minimal, Complete, and Verifiable example.
这是我认为您应该改为做的事情 -- 假设您想要一个图像网格,其中一些是地球、一些是水、一些是草……
- 为基本图像创建 ImageIcons,一个 Icon 用于草,一个 Icon 用于水等...
- 创建一个使用 GridLayout 的 JPanel,并用 JLabel 网格填充它。
- 将相同的 JLabel 放在 JLabel 的二维数组中。
- 通过在 JLabel 上调用
setIcon(newIcon)
,在需要更改图像的位置和时间交换标签图标。
例如,请参阅 this answer of mine to a similar question 以及同一问题的其他答案。