简体   繁体   English

在Java中,如何将JLabel添加到矩形?

[英]In Java, how do I add a JLabel to a rectangle?

I'm trying to add a JLabel onto my health bar that is a simulated by a green rectangle on top of a red rectangle. 我正在尝试将JLabel添加到我的健康栏上,该栏由红色矩形顶部的绿色矩形模拟。 Although I declare a JLabel and attach it to my rectangleComponent, it never shows up. 虽然我声明了一个JLabel并将它附加到我的rectangleComponent,但它永远不会显示出来。 Any ideas? 有任何想法吗? Here's my rectangleComponent and the Frame it's intialized into. 这是我的rectangleComponent和它初始化的Frame。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JComponent;
import javax.swing.JLabel;

public class RectangleComponent extends JComponent
{
    private Color color;
    private int width;
    private int height;
    private int origWidth;
    private JLabel label;
    private Rectangle2D rectangle;
    private boolean wantLabel;
    private int xCoord;
    private int yCoord;

    public RectangleComponent(int x, int y, Color color, int width, int height, boolean wantLabel)
    {
        this.width = width;
        this.height = height;
        this.color = color;
        origWidth = width;
        xCoord = x;
        yCoord = y;
        this.wantLabel = wantLabel;
        if(wantLabel)
        {
            label = new JLabel(this.width + "/" + origWidth);
            label.setLabelFor(this);
        }
        setBounds(xCoord, yCoord, width, height);
        rectangle = new Rectangle2D.Float(xCoord, yCoord, width, height);
    }

    public RectangleComponent(int x, int y, Color color, boolean wantLabel)
    {
        width = 125;
        height = 18;
        xCoord = x;
        yCoord = y;
        this.color = color;
        origWidth = width;
        this.wantLabel = wantLabel;
        if(wantLabel)
        {
            label = new JLabel(this.width + "/" + origWidth);
            label.setLabelFor(this);
        }
        setBounds(xCoord, yCoord, width, height);
        rectangle = new Rectangle2D.Float(xCoord, yCoord, width, height);
    }

    public void paintComponent(Graphics g)
    {
        Graphics2D graphics2 = (Graphics2D) g;
        rectangle = new Rectangle2D.Float(xCoord, yCoord, width, height);
        graphics2.setPaint(color);
        graphics2.fill(rectangle);
        graphics2.draw(rectangle); 
        if(wantLabel)
            label.setText(this.width + "/" + origWidth);
    }

    public Dimension getPreferredSize()
    {
        return (new Dimension(width, height));
    }

    public void subtractLife(int amount)
    {
        width -= amount;
        if(width > 0)
        {
            rectangle.setRect(xCoord, yCoord, width, height);
            repaint();
        }
        else
            width = 0;
    }

    public void addLife(int amount)
    {
        width += amount;
        if(width < origWidth)
        {
            rectangle.setRect(xCoord, yCoord, width, height);
            repaint();
        }
        else width = origWidth;
    }
}


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameFrame extends JFrame
{
    private SpellBarComponent bar;
    private JPanel mainPanel = new JPanel();
    private JPanel buttonPanel = new JPanel();
    Color green = new Color(29, 180, 29);
    Color red = new Color(255, 0, 0);
    private RectangleComponent life;
    private RectangleComponent death;

    public GameFrame(char x)
    {
        setSize(1024, 768);
        setTitle("Game");
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        mainPanel.setLayout(null);
        createPanels(x);
        buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        repaint();
        getContentPane().add(mainPanel, BorderLayout.CENTER);
        getContentPane().add(buttonPanel, BorderLayout.PAGE_END);
        setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);
        setLocationByPlatform(true);
        life.subtractLife(10);
        setVisible(true);

    }

    public RectangleComponent getLife()
    {
        return life;
    }

    private void createHealth()
    {
        life = new RectangleComponent(0, 0, green, true);
        death = new RectangleComponent(0, 0, red, true);
    }

    private void createPanels(char x)
    {
        createBar(x);
        createHealth();
        mainPanel.add(buttonPanel);
        mainPanel.add(life);
        mainPanel.add(death);
        buttonPanel.add(bar.getSpell1());
        buttonPanel.add(bar.getSpell2());
        buttonPanel.add(bar.getSpell3());
    }

    private void createBar(char x)
    {
        bar = new SpellBarComponent(x);
    }
}

You are missing to call add(label) in your component. 您缺少在组件中调用add(label) Your label is therefore not attached to it. 因此,您的标签不附在其上。 Btw, I think it is really disencouraged, if not forbidden, to modify the label in your paintComponent. 顺便说一句,我认为,如果不禁止,它真的是不鼓励修改paintComponent中的标签。 You should rather do that call when widh and/or origWidth are modified. 您应该在修改widh和/或origWidth时执行该调用。

Looks to me that you're missing a call to label.paint() in paintComponent. 在我看来你在paintComponent中缺少对label.paint()的调用。 Alternatively, I think you could call add(label) in your constructor, to add the label as a child of this container, and let paintChildren take care of it. 或者,我认为您可以在构造函数中调用add(label),将标签添加为此容器的子项,并让paintChildren处理它。

Since all you want is a label with a custom background, it may be better to extend JLabel, override paintComponent to paint your custom background, then call super.paintComponent to paint the foreground. 由于你想要的只是一个带有自定义背景的标签,最好扩展JLabel,覆盖paintComponent来绘制自定义背景,然后调用super.paintComponent来绘制前景。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM