java JFrame背景图像

67up9zun  于 2022-12-25  发布在  Java
关注(0)|答案(4)|浏览(118)

我正在创建一个简单的图形用户界面,我想有一个背景图像(2048 X 2048)填补了整个窗口和一个方块的左上角,偶尔64 X 64的图像可以加载。如何做到这一点?
我已经知道如何使JFrame设置大小,它的图像加载我需要帮助。

dbf7pr2w

dbf7pr2w1#

这是一个在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();
    }
}
  • 点击这里了解更多信息
ygya80vv

ygya80vv2#

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

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

有多种方法可以将图像渲染到屏幕上。
你可以使用JLabel。如果你不想修改图像,这是最简单的方法...

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

然后只要将它添加到你的窗口中,如果你需要添加组件,那么你可以简单地设置标签的布局管理器,然后添加你需要的组件。
但是,如果需要更复杂的效果,需要以某种方式更改图像或要应用附加效果,则可能需要使用自定义绘制。
第一个洞穴:不要直接绘制到顶层容器(如JFrame)。顶层容器不是双缓冲的,所以你可能会在重画之间出现一些 Flink ,其他对象在窗口上,所以改变它的绘制过程是很麻烦的,可能会导致其他问题,并且帧的边框渲染在窗口的可视区域内。
相反,创建一个自定义组件,从JPanel之类的东西扩展而来,覆盖它的paintComponent方法并将输出呈现给它,例如...

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

有关详细信息,请参阅Performing Custom Painting2D Graphics

nc1teljy

nc1teljy3#

我使用了一个非常类似于@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。

nwlls2ji

nwlls2ji4#

您可以:

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

在Jframe类构造函数的第一行,这对我来说很好

相关问题