我正在创建一个简单的GUI,想要用一张背景图片(2048 X 2048)填充整个窗口,并在左上角留有一个正方形区域,可以加载偶尔出现的64 X 64图片。如何实现?
我已经知道如何将JFrame设置为固定大小,需要帮助的是如何加载图片。
我正在创建一个简单的GUI,想要用一张背景图片(2048 X 2048)填充整个窗口,并在左上角留有一个正方形区域,可以加载偶尔出现的64 X 64图片。如何实现?
我已经知道如何将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);
}
JLabel
将是最简单的解决方案。请查看更新。 - MadProgrammerBufferedImage 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类构造函数的第一行,这对我来说很好用。