【问题标题】:Showing an image using JPanel使用 JPanel 显示图像
【发布时间】:2013-02-25 19:16:16
【问题描述】:

我在这里使用以前的主题之一编写了自己的 ImagePanel:

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

public class ImagePanel extends JPanel{

    private BufferedImage image = null;

    public ImagePanel(BufferedImage im) {
       image = im;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);            
    }
}

然后我认为在普通的 JPanel 上添加这个面板会很好(使用所有 NetBeans 的东西将它放在框架上会更容易)。所以我添加了一个,NetBeans 为我生成了一些代码: private javax.swing.JPanel pnlImagePanel; 到了我想展示图片的那一刻,所以:

File selectedFile = new File(path);
try {
       image = ImageIO.read(selectedFile);
} catch(IOException ex) {
       throw new RuntimeException(ex);
}
ImagePanel imPanel = new ImagePanel(image);
this.pnlImagePanel = imPanel;
this.pnlImagePanel.repaint();

问题很明显 - 我没有得到任何结果。它不应该工作吗?我已经覆盖了paintComponent 方法,所以应该触发多态性。还是我缺少什么?

【问题讨论】:

    标签: java swing jpanel preferredsize


    【解决方案1】:

    仅将成员变量 pnlImagePanel 分配给您的 ImagePanel 是行不通的,您必须将面板添加JPanel 容器:

    pnlImagePanel.add(imPanel);
    

    您需要为imPanel 指定一个大小,以便可以看到图像。最简单的方法是使用允许子面板占据最大区域的布局管理器。您可以使用GridLayout,而不是默认的FlowLayout

    pnlImagePanel.setLayout(new GridLayout());
    

    这里不需要调用repaint。油漆链机制将确保您的面板上漆。

    【讨论】:

    • 你的意思是pnlImagePanel.add(imPanel)。但是,是的,它奏效了。谢谢。
    【解决方案2】:

    ImagePanel 中覆盖getPrefferedSize() 以返回图像大小,即:

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

    而且,是的,不要忘记按照@Reimeus 的建议将图像面板添加到容器中。给他+1。

    【讨论】:

      【解决方案3】:
      import java.awt.BorderLayout;
      import java.awt.Graphics;
      import javax.swing.ImageIcon;
      
      /**
       * imagePanel
       * @author zhangqi hizhangqi@yahoo.com
       * @date Jan 10, 2013 4:45:05 PM
       * @version V1.0
       */
      public class ImagePanel extends JPanel
      {
      
          private static final long serialVersionUID = 1L;
          private BorderLayout borderLayout = new BorderLayout();
          private ImageIcon image = null;
      
          public ImagePanel(ImageIcon image)
          {
              this.image = image;
              this.setLayout(borderLayout);
          }
      
          protected void paintComponent(Graphics g)
          {
              setOpaque(true);
              super.paintComponent(g);
              if (image != null)
                  g.drawImage(image.getImage(), 0, 0, this.getWidth(),
                          this.getHeight(), this);
          }
      
          public ImageIcon getImage()
          {
              return image;
          }
      
          public void setImage(ImageIcon image)
          {
              this.image = image;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-17
        • 2017-08-02
        • 2017-01-10
        • 2013-01-05
        • 2010-11-17
        • 1970-01-01
        相关资源
        最近更新 更多