[英]JFrame background image
我正在创建一个 GUI,虽然是一个简单的 GUI,但我想要一个背景图像 (2048 X 2048) 填满整个窗口,并在左上角有一个正方形,偶尔可以加载 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));
然后只需将其添加到您认为合适的窗口即可。 如果您需要向其中添加组件,那么您可以简单地将标签的布局管理器设置为您需要的任何内容并添加您的组件。
但是,如果您需要更复杂的东西,需要以某种方式更改图像或想要应用其他效果,则可能需要使用自定义绘画。
第一个隐瞒者:永远不要直接绘制到顶级容器(如JFrame
)。 顶级容器不是双缓冲的,因此您可能会在重绘之间出现一些闪烁,其他对象位于窗口上,因此更改它的绘制过程很麻烦并且可能导致其他问题,并且框架具有在可视区域内呈现的边框窗户的...
相反,创建一个自定义组件,从JPanel
东西扩展。 覆盖它的paintComponent
方法并将您的输出呈现给它,例如......
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, this);
}
我使用了与@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 类构造函数的第一行,这对我来说很好用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.