我想为我的 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
值得阅读 Loading Images Using 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"))
一些要点:
在重写的
paintComponent()
方法的第一行调用super.paintComponent(g);
。使用
ImageIO
而不是Toolkit
加载图像。使用
frame.pack()
而不是frame.setSize()
,根据组件的首选尺寸来适合组件。重写
getPreferredSize()
以设置自定义绘画时JPanel
的首选大小。使用SwingUtilities.invokeLater()或EventQueue.invokeLater()确保EDT已正确初始化。
了解更多
关于java - 设置JFrame背景,为什么这不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24805191/