Here first watch this small example, do let me know if you understood what is going on in here. Then only we will go a step further, slowly slowly. Try to go through this example, in which I am showing you how to draw on a JPanel
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
public class PaintingExample {
private CustomPanel contentPane;
private void displayGUI() {
JFrame frame = new JFrame("Painting Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
contentPane = new CustomPanel();
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String... args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new PaintingExample().displayGUI();
}
});
}
}
class CustomPanel extends JPanel {
private BufferedImage image;
public CustomPanel() {
setOpaque(true);
setBorder(BorderFactory.createLineBorder(Color.BLACK, 5));
try {
/*
* Since Images are Application Resources,
* it's always best to access them in the
* form of a URL, instead of File, as you are doing.
* Uncomment this below line and watch this answer
* of mine, as to HOW TO ADD IMAGES TO THE PROJECT
* https://mcmap.net/q/279686/-loading-resources-like-images-while-running-project-distributed-as-jar-archive
* In order to access images with getClass().getResource(path)
* here your Directory structure has to be like this
* Project
* |
* ------------------------
* | |
* bin src
* | |
* --------- .java files
* | |
* package image(folder)
* ( or |
* .class 404error.jpg
* files, if
* no package
* exists.)
*/
//image = ImageIO.read(
// getClass().getResource(
// "/image/404error.jpg"));
image = ImageIO.read(new URL(
"http://i.imgur.com/8zgHpH8.jpg"));
} catch(IOException ioe) {
System.out.println("Unable to fetch image.");
ioe.printStackTrace();
}
}
/*
* Make this one customary habbit,
* of overriding this method, when
* you extends a JPanel/JComponent,
* to define it's Preferred Size.
* Now in this case we want it to be
* as big as the Image itself.
*/
@Override
public Dimension getPreferredSize() {
return (new Dimension(image.getWidth(), image.getHeight()));
}
/*
* This is where the actual Painting
* Code for the JPanel/JComponent
* goes. Here we will draw the image.
* Here the first line super.paintComponent(...),
* means we want the JPanel to be drawn the usual
* Java way first (this usually depends on the opaque
* property of the said JComponent, if it's true, then
* it becomes the responsibility on the part of the
* programmer to fill the content area with a fully
* opaque color. If it is false, then the programmer
* is free to leave it untouched. So in order to
* overcome the hassle assoicated with this contract,
* super.paintComponent(g) is used, since it adheres
* to the rules, and performs the same task, depending
* upon whether the opaque property is true or false),
* then later on we will add our image to it, by
* writing the other line, g.drawImage(...).
*/
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
}
Compile and Run:
- Start command prompt/terminal/cmd. And move to the location referred
to by the Project folder
Now compile the code by using:
C:\Project>javac -d bin src\*.java
Now move to bin folder, by issuing command:
C:\Project>cd bin
Once inside bin folder, issue the following command to run:
C:\Project\bin>java PaintingExample
Here is the code when using JLabel
as the base for the image :
import java.awt.*;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.*;
public class LabelExample {
private JPanel contentPane;
private JLabel imageLabel;
private void displayGUI() {
JFrame frame = new JFrame("Label Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
contentPane = new JPanel();
contentPane.setOpaque(true);
contentPane.setBorder(
BorderFactory.createLineBorder(Color.BLACK, 5));
//imageLabel = new JLabel(
// new ImageIcon(
// getClass().getResource(
// "/image/404error.jpg")));
try {
imageLabel = new JLabel(new ImageIcon(
new URL("http://i.imgur.com/8zgHpH8.jpg")));
} catch(MalformedURLException mue) {
System.out.println(
"Unable to get Image from"
+ "the Resource specified.");
mue.printStackTrace();
}
contentPane.add(imageLabel);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String... args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new LabelExample().displayGUI();
}
});
}
}
Here is the output of both the above codes :
setVisible(true)
, until theJFrame
's size has been realized. Mean to say, add your components to yourJframe
then callsetVsibile()
. Please have a look at this related example – AnnoraJPanel
, and the picture is on aJLabel
. So what you can do is, either draw the image on theJPanel
as described in the above example shown by me, or else you can add your components to theJLabel
by setting it'sLayout
as described in this example. +1 for atleast showing the code that you are using, though it's not even closer for being a valid SSCCE – Annora