当前位置: 首页 > 知识库问答 >
问题:

设置JFrame背景,为什么这不起作用?

燕刚毅
2023-03-14

我想为我的jFrame设置一个背景,我正在使用下面的代码:

import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DemoBackgroundSwing extends JPanel {

  private Image img;

  public DemoBackgroundSwing() {
      System.out.println("done");
    img = Toolkit.getDefaultToolkit().createImage("red.png");
    System.out.println("done");
    loadImage(img);
    System.out.println("done");
  }

  private void loadImage(Image img) {
    try {
      MediaTracker track = new MediaTracker(this);
      track.addImage(img, 0);
      track.waitForID(0);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

  protected void paintComponent(Graphics g) {
    setOpaque(false);
    System.out.println("done");
    g.drawImage(img, 0, 0, null);
    super.paintComponent(g);
  }

  public static void main(String... argv) {
    JFrame frame = new JFrame("Demo Background Image");
    DemoBackgroundSwing back = new DemoBackgroundSwing();
    System.out.println("done");
    frame.getContentPane().add(back);
    frame.setSize(400, 287);
    frame.setVisible(true);
  }
}

当我执行它时,在系统输出中我有5个“完成”。所以这意味着所有任务都已执行。我不明白错误在哪里。请帮帮我!

共有1个答案

子车灿
2023-03-14

如果加载图像的宽度为-1,则打印加载图像的宽度。

img = Toolkit.getDefaultToolkit().createImage("red.png");
System.out.println(img.getWidth(null)); // check what it prints

关于使用getResource加载图像的Java教程值得一读

您可以根据图像位置尝试任何一个。

// Read from same package 
ImageIO.read(getClass().getResourceAsStream("c.png"));

// Read from images folder parallel to src in your project
ImageIO.read(new File("images/c.jpg"));

// Read from src/images folder
ImageIO.read(getClass().getResource("/images/c.png"))

// Read from src/images folder
ImageIO.read(getClass().getResourceAsStream("/images/c.png"))

阅读更多...

一些要点:

>

  • 调用super.paintComponent(g);位于被覆盖的PaintComponent()方法的第一行。

    使用< code>ImageIO而不是< code>Toolkit来加载映像。

    使用<code>框架。pack()而不是框架。setSize(),根据组件的首选尺寸安装组件。

    重写getPreferredSize()以设置JBoard在自定义绘制的情况下的首选大小。

    使用SwingUtilities。invokeLater()或EventQueue。invokeLater()以确保EDT已正确初始化。

    阅读更多

    > < li>

    为什么在main方法中使用SwingUtilities.invokeLater?

    SwingUtilities.invokeLater

    我们是否应该使用 EventQueue.invokeLater 在 Java 桌面应用程序中的任何 GUI 更新?

  •  类似资料:
    • 问题内容: 如何设置JFrame的背景颜色? 问题答案: 检索框架的内容窗格,并使用从继承的方法更改颜色。 例:

    • 我正在用Java制作一个游戏,目前背景设置不起作用,但前景设置可以工作。以下是我的主类代码: 下面是我的Screen类的代码:

    • 问题内容: 有什么方法可以将图像设置为背景JFrame? 问题答案: 没有内置方法,但是有几种方法可以实现。目前我能想到的最直接的方法是: 创建的子类。 重写绘制想要显示的图像的方法。 设置内容窗格的是这个子类。 一些示例代码: 请注意,如果你要使用此代码,则不会处理调整图像大小以适合的大小。

    • 由于某些原因,ImagePanel的大小与JFrame的大小不相同(如这里所示:http://prntscr.com/l8d98i)。当我将ImagePanel的大小设置为JFrame的大小时,我的组件都会调整大小。这是为什么?如图所示:http://prntscr.com/l8d9ka

    • 问题内容: 我学习Java已有几周了,在将背景图像应用于JFrame时,我真的很困惑。我遇到的每个教程都不像我那样创建Frames(我扩展了JFrame),或者如果这样做,说明还不够清楚,我无法理解。 下面的代码来自我自己的项目,因此可以帮助我练习到目前为止所学的内容。请您能否以下面的代码为基础,并向我说明要添加的内容和位置,所以我可能以图像作为框架的背景? 我真正要感谢的一件事是,如果您能解释事

    • 问题内容: 我正在尝试通过以下方式将日期范围划分为各个日期: 而且我不知道为什么不起作用,因为日期仍然相同,所以循环变得无限。 问题答案: plusDays不会改变原始的,您必须分配结果: