设置 JFrame 背景,为什么这不起作用? [英] setting a JFrame background, why this doesn't work?
问题描述
我想为我的 jFrame 设置背景,我正在使用以下代码:
import java.awt.Graphics;导入 java.awt.Image;导入 java.awt.MediaTracker;导入 java.awt.Toolkit;导入 javax.swing.JFrame;导入 javax.swing.JPanel;公共类 DemoBackgroundSwing 扩展 JPanel {私人图像 img;公共 DemoBackgroundSwing() {System.out.println("完成");img = Toolkit.getDefaultToolkit().createImage("red.png");System.out.println("完成");加载图像(img);System.out.println("完成");}私有无效加载图像(图像 img){尝试 {MediaTracker track = new MediaTracker(this);track.addImage(img, 0);track.waitForID(0);} catch (InterruptedException e) {e.printStackTrace();}}受保护的无效paintComponent(图形g){设置不透明(假);System.out.println("完成");g.drawImage(img, 0, 0, null);super.paintComponent(g);}公共静态无效主(字符串... argv){JFrame frame = new JFrame("演示背景图片");DemoBackgroundSwing back = new DemoBackgroundSwing();System.out.println("完成");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));//检查打印的内容
值得阅读上的Java教程使用 getResource 加载图像
<小时>您可以根据图像位置尝试任何一种.
//从同一个包中读取ImageIO.read(getClass().getResourceAsStream("c.png"));//从项目中与 src 平行的图像文件夹中读取ImageIO.read(new File("images/c.jpg"));//从 src/images 文件夹中读取ImageIO.read(getClass().getResource("/images/c.png"))//从 src/images 文件夹中读取ImageIO.read(getClass().getResourceAsStream("/images/c.png"))
阅读更多...><小时>
几点:
在重写的
paintComponent()
方法的第一行调用super.paintComponent(g);
.使用
ImageIO
而不是Toolkit
来加载图像.使用
frame.pack()
而不是frame.setSize()
以适应组件的首选大小.覆盖
getPreferredSize()
以在自定义绘画的情况下设置JPanel
的首选大小.使用 SwingUtilities.invokeLater() 或 EventQueue.invokeLater() 以确保 EDT 已正确初始化.
阅读更多
I want to set a background to my jFrame, and I'm using this code:
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);
}
}
when I execute it, in system out I have 5 "done". so this means that all tasks are executed. I don't understand where's the error. Please Help me!
Print the width of loaded image if it's -1 then image is not properly loaded.
img = Toolkit.getDefaultToolkit().createImage("red.png");
System.out.println(img.getWidth(null)); // check what it prints
It's worth reading Java Tutorial on Loading Images Using getResource
You can try any one based on image location.
// 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"))
Some Points:
call
super.paintComponent(g);
at first line in the overriddenpaintComponent()
method.Use
ImageIO
instead ofToolkit
to load the image.Use
frame.pack()
instead offrame.setSize()
that fits the components as per component's preferred size.Override
getPreferredSize()
to set the preferred size of theJPanel
in case of custom painting.Use SwingUtilities.invokeLater() or EventQueue.invokeLater() to make sure that EDT is initialized properly.
Read more
这篇关于设置 JFrame 背景,为什么这不起作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!