java不能是用jframe_java – 设置JFrame背景,为什么这不起作用?

我想为我的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)则图像未正确加载.

img = Toolkit.getDefaultToolkit().createImage("red.png");

System.out.println(img.getWidth(null)); // check what it prints

您可以根据图像位置尝试任何一种.

// 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()方法的第一行.

>使用ImageIO而不是Toolkit加载图像.

>使用frame.pack()代替frame.setSize(),它根据组件的首选大小调整组件.

>在自定义绘制的情况下,覆盖getPreferredSize()以设置JPanel的首选大小.

>使用SwingUtilities.invokeLater()或EventQueue.invokeLater()确保正确初始化EDT.

阅读更多

标签:java,swing

来源: https://codeday.me/bug/20191002/1844586.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值