Reputation: 555
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();
}
}
Upvotes: 1
Views: 5003
Reputation: 24626
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());
}
}
Upvotes: 5
Reputation: 501
I checked entire code and executed
actually the label is on the top of the JPanel but it location gone to out of the jpanel boundary when you calling/object creating for "ColoredRect()" pass the parameters as minimum as
//pass the values and check it
ColoredRect(77,17,"string");
because location of label is x+3 and y+3 means 77+3+label width 20=100; x+3 means 17+3+ label heigth 20=40,
if you pass more than 77,17 the label location out of panel boundary
OR change the
this.width = 1000;
this.height =500;
Upvotes: 1
Reputation: 1480
Depending on what text you want to add to your JLabel, you set the size of the label in paintComponent(Graphics g)
to be 20 px wide and 20 px height. 20 px width isn't very wide. Try to increase the label width if you have a label text longer than a couple of chars.
Upvotes: 1