【问题标题】:JFrame background imageJFrame 背景图片
【发布时间】:2013-09-17 15:27:42
【问题描述】:

我正在创建一个 GUI,虽然它很简单,但我希望有一个背景图像 (2048 X 2048) 填满整个窗口,并在左上角有一个正方形,偶尔可以加载 64 X 64 图像.在此先感谢任何提供帮助的人:) 编辑:我已经知道如何将 JFrame 设置为固定大小,它的图像加载我需要帮助。

【问题讨论】:

  • 在能够提交像我这样的帖子之前,系统会提示他们这样做。我没有找到任何相关的东西,所以我继续写这个。如果我发布此内容引起您的烦恼,我希望这是您必须面对的最大不便。
  • @Aaron,我访问过 javaranch.com 和 java-forums.org。他们在那边很好。他们也很有能力。 JavaRanch 的座右铭是“JavaRanch,对新手友好”。我对你的问题感兴趣,+1。
  • 请看一下这个答案,关于如何load images in your project。还有@Kaydell,也请你。希望它有所帮助:-)
  • 谢谢,感谢大家的关注和帮助!

标签: java swing background jframe


【解决方案1】:

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

【讨论】:

  • 所以最后的 sesize() 刷新图像?
  • @Aaron,我相信与其调用 setSize() 两次来刷新窗口,不如总是最后调用 setVisible(true) 并且窗口将被正确绘制。
  • 我研究了 Nambi 的代码并学到了一些东西,但我更改了代码,我相信会改进它。这是我的代码版本的链接,带有 cmets:gist.github.com/kaydell/6565219
  • 谢谢,所有这些建议都非常有用,感谢所有帮助 :)
  • 使用 pack over set size 并让布局管理器处理它。最后调用 setVisible 以确保框架第一次正确绘制自身。
【解决方案2】:

加载图片的最佳方式是通过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);
}

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

【讨论】:

  • 我将如何使用它?我是否将其放在 JLabel 中?
  • @Aaron 这将取决于您的最终目标以及您需要多少控制权。是的,JLabel 将是最简单的解决方案。查看更新
  • 很高兴有帮助:)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    你可以这样做:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-13
      • 2011-02-08
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      相关资源
      最近更新 更多