当我将FlowLayout用于JFrame时,为什么我的图像不会出现?

时间:2014-05-19 01:33:55

标签: java swing layout layout-manager

有一个我不明白的问题:如果drawImage()的布局是JFrame或{{1},为什么我能够使用BorderLayout方法绘制图像但不是GridLayoutGridbagLayoutFlowLayout?有人可以向我解释一下吗?

以下是代码:

BoxLayout

1 个答案:

答案 0 :(得分:3)

因为前两个布局,JLabel将填充容器,这里是JPanel。对于其他布局,它将调整为preferredSize的大小为0.如果您希望使用其他布局,请考虑覆盖getPreferredSize。

另请注意:

  • 如果没有paintComponent方法,则不应读入图像文件。
  • 如果可能,您不应该重新读取图像文件(如果您在重复调用的方法中读取图像,则会发生这种情况)。一次读取它们,例如在构造函数中,并将它们存储在一个字段中。
  • 您不应该处置JVM为您提供的Graphics对象,只能处理您自己创建的对象(例如来自BufferedImage)。

修改
例如,像这样:

private class TransparentBG extends JLabel {
  BufferedImage image;

  public TransparentBG() throws IOException {
     image = ImageIO.read(TransparentBG.class.getClassLoader()
           .getResourceAsStream("footballQuestioner/rightAnswerSign.png"));
  }

  @Override
  protected void paintComponent(Graphics g) {
     super.paintComponent(g);
     Graphics2D g2d = (Graphics2D) g;
     if (image != null) {
        g2d.drawImage(image, 0, 0, null);
     }
     // g2d.dispose();
  }

  @Override
  public Dimension getPreferredSize() {
     if (image != null) {
        int w = image.getWidth();
        int h = image.getHeight();
        return new Dimension(w, h);
     }
     return super.getPreferredSize();
  }
}