When I run my code then JLabel
is looking behind the JPanel
. Why this is happening? I have to show the label on top of panel.
public class ColoredRect extends JPanel{
public double x, y, width, height;
public JLabel name;
public ColoredRect(double x,double y,String label)
{
name = new JLabel(label);
this.x = x;
this.y = y;
this.width = 100;
this.height =40;
setLocation((int)x,(int)y);
setSize((int)width,(int)height);
setBackground(Color.red);
add(name);
}
public void paintComponent(Graphics g) {
// Draw all the rects in the ArrayList.
super.paintComponent(g); // Fills with background color, white.
name.setForeground(Color.BLACK);
name.setVisible(true);
name.setLocation((int)x+3, (int)y+3);
name.setSize(20, 20);
name.repaint();
}
public void setnewPosition(double x, double y)
{
this.x =x;
this.y =y;
this.setLocation((int)x,(int) y);
repaint();
}
}
You never used the setOpaque(), method to set it's value as being OPAQUE
. Here have a look at this example, see how you draw on the JPanel
and add JLabel
on it.
import java.awt.*;
import javax.swing.*;
public class PanelPaintingExample
{
private ColouredRectangle cRect, cRect1, cRect2;
private Rectangle rect;
public PanelPaintingExample()
{
rect = new Rectangle(0, 0, 200, 30);
}
private void displayGUI()
{
JFrame frame = new JFrame("Panel Painting Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
cRect = new ColouredRectangle(Color.RED, "LABEL 1"
, Color.WHITE
, rect);
cRect1 = new ColouredRectangle(Color.BLUE, "LABEL 2"
, Color.WHITE
, rect);
cRect2 = new ColouredRectangle(Color.MAGENTA, "LABEL 3"
, Color.WHITE
, rect);
frame.add(cRect);
frame.add(cRect1);
frame.add(cRect2);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new PanelPaintingExample().displayGUI();
}
});
}
}
class ColouredRectangle extends JPanel
{
private Color backColour;
private Color foreColour;
private String text;
private Rectangle rect;
private JLabel label;
public ColouredRectangle(Color b, String text
, Color f, Rectangle rect)
{
this.backColour = b;
this.foreColour = f;
this.text = text;
this.rect = rect;
label = new JLabel(this.text, JLabel.CENTER);
label.setOpaque(true);
label.setBackground(backColour);
label.setForeground(foreColour);
add(label);
}
@Override
public Dimension getPreferredSize()
{
return (new Dimension(200, 30));
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(backColour);
g.fillRect((int)rect.getX(), (int)rect.getY()
, (int)rect.getWidth()
, (int)rect.getHeight());
}
}