Reputation: 35
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!
Upvotes: 2
Views: 204
Reputation: 46861
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 overridden paintComponent()
method.
Use ImageIO
instead of Toolkit
to load the image.
Use frame.pack()
instead of frame.setSize()
that fits the components as per component's preferred size.
Override getPreferredSize()
to set the preferred size of the JPanel
in case of custom painting.
Use SwingUtilities.invokeLater() or EventQueue.invokeLater() to make sure that EDT is initialized properly.
Read more
Upvotes: 4