Java JComponent未在JPanel内部绘制

Java JComponent未在JPanel内部绘制,java,swing,Java,Swing,对于摇摆的普通顾客来说,这是一个简单的问题 其思想是加载一个图像,并通过JComponent对象将其用作JPanel的背景。当toString()方法中的图像信息正确加载且paintComponent()方法正在运行时,它似乎加载得很好,但由于某些原因,它在JFrame中无法正确渲染,导致出现空帧。代码如下: RicochetFrame.java public class RicochetFrame extends JFrame { RicochetStartPanel startPanel

对于摇摆的普通顾客来说,这是一个简单的问题

其思想是加载一个图像,并通过JComponent对象将其用作JPanel的背景。当
toString()
方法中的图像信息正确加载且
paintComponent()
方法正在运行时,它似乎加载得很好,但由于某些原因,它在JFrame中无法正确渲染,导致出现空帧。代码如下:

RicochetFrame.java

public class RicochetFrame extends JFrame {
  RicochetStartPanel startPanel;

  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                RicochetFrame window = new RicochetFrame();
                window.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
   }

  public RicochetFrame() throws IOException {
    startPanel = new RicochetStartPanel();

    this.getContentPane().add(startPanel);

    this.setBounds(0, 0, 500, 500);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //this.pack();
    this.setVisible(true);
  }

}
public class RicochetStartPanel extends JPanel {
  RicochetStartPanel() throws IOException {
    BufferedImage myImage = ImageIO.read(new File("frame_bg.jpg"));
    this.add(new RicochetImagePanel(myImage));

    this.setVisible(true);

    this.validate();
    this.repaint();
  }

}
public class RicochetImagePanel extends JComponent {
  private Image image;

  public RicochetImagePanel(Image image) {
    this.setVisible(true);

    this.image = image;
  }
  @Override
  protected void paintComponent(Graphics g) {  
    super.paintComponent(g);
    g.drawImage(image, 0, 0, this);
  }
}
RicochetStartPanel.java

public class RicochetFrame extends JFrame {
  RicochetStartPanel startPanel;

  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                RicochetFrame window = new RicochetFrame();
                window.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
   }

  public RicochetFrame() throws IOException {
    startPanel = new RicochetStartPanel();

    this.getContentPane().add(startPanel);

    this.setBounds(0, 0, 500, 500);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //this.pack();
    this.setVisible(true);
  }

}
public class RicochetStartPanel extends JPanel {
  RicochetStartPanel() throws IOException {
    BufferedImage myImage = ImageIO.read(new File("frame_bg.jpg"));
    this.add(new RicochetImagePanel(myImage));

    this.setVisible(true);

    this.validate();
    this.repaint();
  }

}
public class RicochetImagePanel extends JComponent {
  private Image image;

  public RicochetImagePanel(Image image) {
    this.setVisible(true);

    this.image = image;
  }
  @Override
  protected void paintComponent(Graphics g) {  
    super.paintComponent(g);
    g.drawImage(image, 0, 0, this);
  }
}
RicochetImagePanel.Java

public class RicochetFrame extends JFrame {
  RicochetStartPanel startPanel;

  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                RicochetFrame window = new RicochetFrame();
                window.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
   }

  public RicochetFrame() throws IOException {
    startPanel = new RicochetStartPanel();

    this.getContentPane().add(startPanel);

    this.setBounds(0, 0, 500, 500);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //this.pack();
    this.setVisible(true);
  }

}
public class RicochetStartPanel extends JPanel {
  RicochetStartPanel() throws IOException {
    BufferedImage myImage = ImageIO.read(new File("frame_bg.jpg"));
    this.add(new RicochetImagePanel(myImage));

    this.setVisible(true);

    this.validate();
    this.repaint();
  }

}
public class RicochetImagePanel extends JComponent {
  private Image image;

  public RicochetImagePanel(Image image) {
    this.setVisible(true);

    this.image = image;
  }
  @Override
  protected void paintComponent(Graphics g) {  
    super.paintComponent(g);
    g.drawImage(image, 0, 0, this);
  }
}

您的
RicocheImagePanel
正在将自身大小调整为其首选大小=>[0,0]。重写其
getPreferredSize()
以返回图像的尺寸(如果不是null)。更好的是,为什么不在JLabel中简单地将图像显示为ImageIcon?

buffereImage myImage=ImageIO.read(新文件(“frame_bg.jpg”)应用程序资源在部署时将成为嵌入式资源,因此现在就开始像访问一样访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。