I think people may hate me for repeating this :P:
- Dont extend JFrame class
- Class names begin with captial letter i.e
Guikopie
Also depending on what the background is being used for i.e if its a logo that will be added to a specific location on the JPanel
then using a JLabel
is fine, however, if its being used as a background it is not; because it will moved around as more components are being added, thus we should not add the background as a component rather we paint the background on the component.
As for your question:
My question is: Why does this code do not display the picture?
your code works perfect for me thus the location of your picture must be incorrect.
I did a short example showing how to add a Image
to JPanel
background and then add JPanel
to JFrame
, it also includes class ImgUtils
for resizing picture:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class JFrameWithPicture {
public JFrameWithPicture() throws MalformedURLException, IOException {
initComponents();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
new JFrameWithPicture();
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
}
private void initComponents() throws MalformedURLException, IOException {
JFrame frame = new JFrame("Frame with JPanel and background");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Image background = ImageUtils.scaleImage(300, 300, ImageIO.read(new URL("http://images2.layoutsparks.com/1/98191/naruto-14-red-design.jpg")));
final Dimension jpanelDimensions = new Dimension(new ImageIcon(background).getIconWidth(), new ImageIcon(background).getIconHeight());
frame.add(new JPanel() {
@Override
protected void paintComponent(Graphics grphcs) {
super.paintComponent(grphcs);
grphcs.drawImage(background, 0, 0, this);
}
@Override
public Dimension getPreferredSize() {
return jpanelDimensions;
}
});
frame.setResizable(false);
frame.pack();
frame.setVisible(true);
}
}
class ImageUtils {
public static BufferedImage scaleImage(int width, int height, String filename) {
BufferedImage bi;
try {
ImageIcon ii = new ImageIcon(filename);
bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) bi.createGraphics();
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
g2d.drawImage(ii.getImage(), 0, 0, width, height, null);
} catch (Exception e) {
return null;
}
return bi;
}
static Image scaleImage(int width, int height, BufferedImage filename) {
BufferedImage bi;
try {
bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) bi.createGraphics();
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
g2d.drawImage(filename, 0, 0, width, height, null);
} catch (Exception e) {
return null;
}
return bi;
}
}
Alternatively you may want to resize using Image#getScaledInstance(int width,int height,int hints), but this has its perils, the main problem being:
Image.getScaledInstance()
does not return a finished, scaled image.
It leaves much of the scaling work for a later time when the image
pixels are used.