当我运行我的代码时,JLabel
正在查看JPanel
。为什么会这样?我必须在面板顶部显示标签。
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();
}
}
答案 0 :(得分:5)
您从未使用setOpaque()方法将其值设置为OPAQUE
。下面我们来看看这个示例,看看您如何在JPanel
上绘制并在其上添加JLabel
。
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());
}
}
答案 1 :(得分:1)
根据要添加到JLabel的文本,可以将paintComponent(Graphics g)
中标签的大小设置为20 px宽和20 px高。 20像素宽度不是很宽。如果标签文本长于几个字符,请尝试增加标签宽度。
答案 2 :(得分:1)
我检查了整个代码并执行了
实际上标签位于JPanel的顶部,但是当你为“ColoredRect()”调用/ object创建时,它的位置已经超出jpanel边界,将参数传递给
//pass the values and check it
ColoredRect(77,17,"string");
因为标签的位置是x + 3而y + 3意味着77 + 3 +标签宽度20 = 100; x + 3表示17 + 3 +标签高度20 = 40,
如果您从面板边界传递超过77,17的标签位置
或更改
this.width = 1000;
this.height =500;