在 JFrame 中将图像绘制到 JPanel

Posted

技术标签:

【中文标题】在 JFrame 中将图像绘制到 JPanel【英文标题】:Drawing an Image to a JPanel within a JFrame 【发布时间】:2012-02-23 09:09:57 【问题描述】:

我正在设计一个在 JFrame 中包含两个 JPanel 的程序,一个用于保存图像,另一个用于保存 GUI 组件(搜索字段等)。我想知道如何将图像绘制到 JFrame 中的第一个 JPanel?

这是我的构造函数的示例代码:

public UITester() 
    this.setTitle("Airplane");
    Container container = getContentPane();
    container.setLayout(new FlowLayout());
    searchText = new JLabel("Enter Search Text Here");
    container.add(searchText);
    imagepanel = new JPanel(new FlowLayout());
    imagepanel.paintComponents(null);
   //other constructor code

public void paintComponent(Graphics g)
    super.paintComponents(g);
    g.drawImage(img[0], -50, 100, null);

我试图重写 JPanel 的 paintComponent 方法来绘制图像,但是当我尝试编写时,这会导致我的构造函数出现问题:

imagepanel.paintComponents(null);

因为它只允许我传递 null 方法,而不是 Graphics g,所以有人知道此方法的修复方法或我可以用来在 JPanel 中绘制图像的其他方法吗?帮助表示赞赏! :)

一切顺利,提前感谢! 马特

【问题讨论】:

从你的构造函数调用paintComponents的想法是什么?。只需将其删除。 顺便说一句 - 你为什么不画图像最左边的 50 个像素? 【参考方案1】:

您可以使用JLabel.setIcon() 在JPanel 上放置图像,如here 所示。

另一方面,如果你想要一个有背景的面板,你可以看看this教程。

【讨论】:

最好链接到最新版本的JavaDocs。我已将您的答案编辑为指向 J2SE 7。有关获取最新文档链接的提示,请参阅 point 2 of advantages。 @AndrewThompson : 请原谅我,但现在 J2SE 不是称为 Java SE。问候 @GagandeepBali 什么,这一分钟? Sun 经常更改事物的名称,以至于我厌倦了跟上最新的流行语。 :( @AndrewThompson :呵呵,太真实了,只是有人编辑过我的答案一次,这就是为什么我记得它到现在,否则毫无疑问这样的事情很难记住。问候【参考方案2】:

我想建议一个更简单的方法,

  image = ImageIO.read(new File(path));
  JLabel picLabel = new JLabel(new ImageIcon(image));

耶耶!现在您的图像是一个摆动组件!将它添加到框架或面板或您通常做的任何东西!可能也需要重新粉刷,比如

  jpanel.add(picLabel);
  jpanel.repaint(); 

【讨论】:

一张小纸条。鉴于这听起来很像一个应用程序资源,它通常会通过 URL 而不是 File 访问。 如果我想在特定的 x 和 y 位置绘制图片怎么办【参考方案3】:

无需从构造函数手动调用paintComponent()。问题是您为Graphics 对象传递了null。相反,覆盖paintComponent() 并使用Graphics 对象传递给您将用于绘画的方法。检查此tutorial。这是一个带有图像的JPanel 示例:

class MyImagePanel extends JPanel 
    BufferedImage image;
    public void paintComponent(Graphics g)
        super.paintComponent(g);
        if(image != null)
            g.drawImage(image, 0, 0, this);
        
    

【讨论】:

以上是关于在 JFrame 中将图像绘制到 JPanel的主要内容,如果未能解决你的问题,请参考以下文章

JPanel 在调整 Jframe 大小之前不会更新

一次将数百个图像绘制到 JFrame 的有效方法是啥?

Java Swing:为啥我不能在 JFrame 实例上绘制图像()?

JFrame 绘制带有 alpha 通道的动画 gif 图像

将图像添加到 JFrame

无法在javascript中将图像绘制到画布