我正在尝试在另一个JPanel中创建一个带有背景图像的JPanel,但背景图像没有显示出来。我该如何解决这个问题?
public class CustomPanel extends JPanel{
Image img;
private final static String BACKGROUND = "images/background.png";
private void loadImage(String filename){
try{
img = Toolkit.getDefaultToolkit().getImage(filename);
} catch(Exception e){}
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(this.img, 0, 0,null);//display this image as a background
Toolkit.getDefaultToolkit().sync();//makes animations smooth
}
public CustomPanel(){
this.setLayout(null);
this.loadImage(this.BACKGROUND);//prepare background image
this.repaint();//set bg image
}
}
这是MainPanel,它将保留其他具有背景的JPanel。
public class MainPanel extends JPanel{
public Container container;
public MainPanel(Container container){
this.setLayout(null);
this.container = container;
CustomPanel panel= new CustomPanel();
this.add(panel);
}
}
我已经阅读了与此相关的其他问题,其中大部分是未能设置super.paintComponent(g)。我已经在我的代码中完成了这个,所以我不知道什么似乎是问题
答案 0 :(得分:1)
默认情况下,组件的大小为(0,0),因此无需绘制任何内容。
您需要覆盖getPreferredSize()
的{{1}}方法才能返回图片大小。
然后布局管理器可以使用此信息来设置面板的大小和位置。
但是,由于您只是以实际大小绘制图像,因此另一种解决方案是将ImageIcon添加到JLabel并将标签添加到面板。只有在您计划更改图像时才需要自定义绘画,可能需要通过缩放来适应面板大小的变化。
有关更多信息和示例,请参阅Background Panel。
答案 1 :(得分:0)
我可以看到两件事可能是错的:
Toolkit.getDefaultToolkit().getImage(filename)
中抛出异常。所以@Berger提到,我会打印出异常; MainPanel
容器未正确设置,我们没有看到该部分代码,因此我会对其进行验证。