2

コードを実行するとJLabelJPanel. なぜこれが起こっているのですか?パネルの上にラベルを表示する必要があります。

コード

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()メソッドを使用して、その値を として設定したことはありません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ピクセル、高さ20ピクセルに設定します。20ピクセル幅はそれほど広くありません。ラベルテキストが数文字より長い場合は、ラベル幅を大きくしてみてください。

于 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 に答える