在 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的主要内容,如果未能解决你的问题,请参考以下文章
Java Swing:为啥我不能在 JFrame 实例上绘制图像()?