将JLabel置于JPanel之上

时间:2012-06-29 06:49:53

标签: java swing jlabel graphics2d paintcomponent

当我运行我的代码时,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();
      }
}

3 个答案:

答案 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;