2

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

3 回答 3

5

您从未使用setOpaque()方法将其值设置为 being 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());
    }
}
于 2012-06-29T07:37:57.250 回答
1

根据您要添加到 JLabel 的文本,您将标签的大小设置paintComponent(Graphics g)为 20 px 宽和 20 px 高。20 px 宽度不是很宽。如果标签文本长于几个字符,请尝试增加标签宽度。

于 2012-06-29T07:21:47.313 回答
1

我检查了整个代码并执行

实际上,标签位于 JPanel 的顶部,但是当您为“ColoredRect()”调用/创建对象时,它的位置超出了 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;
于 2012-06-29T07:40:37.230 回答