12

I am creating a GUI, albeit a simple one, and I want to have a background image (2048 X 2048) fill up the whole window and a square to the left top corner where the occasional 64 X 64 image can be loaded. Thanks in advance to anyone who helps out :) Edit: I already know how to make the JFrame a set size, its the image loading I need help with.

4

4 回答 4

16

这是一个在 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();
    }
} 
  • 点击这里了解更多信息
于 2013-09-13T05:05:55.360 回答
12

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

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);
}

查看Performing Custom Painting2D Graphics了解更多详情

于 2013-09-13T03:42:06.297 回答
5

我使用了与@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。

于 2015-03-20T11:42:11.607 回答
3

你可以做:

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

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

于 2014-01-24T17:18:16.823 回答