JPanel

时间:2017-05-19 13:16:24

标签: java swing jpanel

我正在尝试在另一个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)。我已经在我的代码中完成了这个,所以我不知道什么似乎是问题

2 个答案:

答案 0 :(得分:1)

默认情况下,组件的大小为(0,0),因此无需绘制任何内容。

您需要覆盖getPreferredSize()的{​​{1}}方法才能返回图片大小。

然后布局管理器可以使用此信息来设置面板的大小和位置。

但是,由于您只是以实际大小绘制图像,因此另一种解决方案是将ImageIcon添加到JLabel并将标签添加到面板。只有在您计划更改图像时才需要自定义绘画,可能需要通过缩放来适应面板大小的变化。

有关更多信息和示例,请参阅Background Panel

答案 1 :(得分:0)

我可以看到两件事可能是错的:

  1. Toolkit.getDefaultToolkit().getImage(filename)中抛出异常。所以@Berger提到,我会打印出异常;
  2. MainPanel容器未正确设置,我们没有看到该部分代码,因此我会对其进行验证。
  3. 要查看工作示例,请参阅How do I draw an image to a JPanel or JFrame?