JFrame背景图像

我正在创build一个GUI,虽然很简单,但我想要一个背景图像(2048 X 2048)填充整个窗口,并在左上angular放置一个正方形,偶尔可以加载64 X 64图像。 在此先感谢任何人帮助:)编辑:我已经知道如何使JFrame设置大小,它的图像加载我需要帮助。

这是在jframe中添加背景图像的简单示例

import javax.swing.*; import java.awt.*; import java.awt.event.*; class BackgroundImageJFrame extends JFrame { JButton b1; JLabel l1; public BackgroundImageJFrame() { setTitle("Background Color for JFrame"); setSize(400,400); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); /* One way ----------------- setLayout(new BorderLayout()); JLabel background=new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads\\colorful design.png")); add(background); background.setLayout(new FlowLayout()); l1=new JLabel("Here is a button"); b1=new JButton("I am a button"); background.add(l1); background.add(b1); */ // Another way setLayout(new BorderLayout()); setContentPane(new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads\\colorful design.png"))); setLayout(new FlowLayout()); l1=new JLabel("Here is a button"); b1=new JButton("I am a button"); add(l1); add(b1); // Just for refresh :) Not optional! setSize(399,399); setSize(400,400); } public static void main(String args[]) { new BackgroundImageJFrame(); } } 
  • 点击这里获取更多信息

加载图像的最佳方式是通过ImageIO API

 BufferedImage img = ImageIO.read(new File("/path/to/some/image")); 

有很多方法可以将图像渲染到屏幕上。

你可以使用JLabel 。 这是最简单的方法,如果你不想修改图像…

 JLabel background = new JLabel(new ImageIcon(img)); 

然后,只要将其添加到您认为合适的窗口。 如果您需要添加组件,那么您可以简单地将标签的布局pipe理器设置为您需要的任何内容并添加组件。

但是,如果您需要更复杂的东西,需要以某种方式更改图像或想要应用其他效果,则可能需要使用自定义绘画。

首先cavert:不要直接绘制到顶层容器(如JFrame )。 顶级容器不是双重缓冲的,所以最终可能会在重新绘制之间出现一些闪烁现象,而其他对象则位于窗口上,所以更改其绘制过程很麻烦,并且可能导致其他问题,并且框架在可视区域内呈现边框的窗户…

相反,创build一个自定义组件,从JPanel东西延伸。 覆盖它的paintComponent方法并将其输出呈现给它,例如…

 protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(img, 0, 0, this); } 

请参阅执行自定义绘画和2Dgraphics以获取更多详细信息

我对@bott使用了一个非常类似的方法,但是我修改了一下,以便不需要调整图像大小:

 BufferedImage img = null; try { img = ImageIO.read(new File("image.jpg")); } catch (IOException e) { e.printStackTrace(); } Image dimg = img.getScaledInstance(800, 508, Image.SCALE_SMOOTH); ImageIcon imageIcon = new ImageIcon(dimg); setContentPane(new JLabel(imageIcon)); 

每次工作。 你也可以得到jFrame的宽度和高度,并分别用800和508来代替。

你可以做:

 setContentPane(new JLabel(new ImageIcon("resources/taverna.jpg"))); 

在Jframe类构造函数的第一行,对我来说工作正常