在java中,我希望有两个矩形,一个在另一个后面以模拟健康栏,它们不工作

在java中,我希望有两个矩形,一个在另一个后面以模拟健康栏,它们不工作,java,jpanel,jlabel,jcomponent,Java,Jpanel,Jlabel,Jcomponent,我在游戏框架中创建了两个矩形组件,但它们永远不会在同一个位置,尽管这些组件是用相同的X,Y坐标构建的。有人知道怎么解决这个问题吗?我还在顶部的绿色矩形上做了一个JLabel,但它从未出现过。 谢谢你抽出时间 import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.JFrame; import ja

我在游戏框架中创建了两个矩形组件,但它们永远不会在同一个位置,尽管这些组件是用相同的X,Y坐标构建的。有人知道怎么解决这个问题吗?我还在顶部的绿色矩形上做了一个JLabel,但它从未出现过。 谢谢你抽出时间

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);
        createPanels(x);
        buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        mainPanel.setLayout(new GridLayout(0, 2, 5, 5));
        repaint();
        getContentPane().add(mainPanel, BorderLayout.CENTER);
        getContentPane().add(buttonPanel, BorderLayout.PAGE_END);
        setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);
        setLocationByPlatform(true);
        setVisible(true);

    }

    public RectangleComponent getLife()
    {
        return life;
    }

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

    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);
    }
}

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

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

public class RectangleComponent extends JComponent
{
    private Color color;
    private int width;
    private int height;
    private RoundRectangle2D roundedRectangle;
    private int origWidth;
    private JLabel label;
    private boolean wantLabel;

    public RectangleComponent(Color color, int width, int height, boolean wantLabel)
    {
        this.width = width;
        this.height = height;
        this.color = color;
        origWidth = width;
        this.wantLabel = wantLabel;
        if(wantLabel)
        {
            label = new JLabel(this.width + "/" + origWidth);
            label.setLabelFor(this);
        }
    }

    public RectangleComponent(Color color, boolean wantLabel)
    {
        width = 125;
        height = 18;
        this.color = color;
        origWidth = width;
        this.wantLabel = wantLabel;
        if(wantLabel)
        {
            label = new JLabel(this.width + "/" + origWidth);
            label.setLabelFor(this);
        }
    }

    public void paintComponent(Graphics g)
    {
        Graphics2D graphics2 = (Graphics2D) g;
        roundedRectangle = new RoundRectangle2D.Float(10, 10, width, height, 10, 10);
        graphics2.setPaint(color);
        graphics2.fill(roundedRectangle);
        graphics2.draw(roundedRectangle); 
        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)
        {
            roundedRectangle.setRoundRect(10, 10, width, height, 10, 10);
            repaint();
        }
        else
            width = 0;
    }

    public void addLife(int amount)
    {
        width += amount;
        if(width < origWidth)
        {
            roundedRectangle.setRoundRect(10, 10, width, height, 10, 10);
            repaint();
        }
        else width = origWidth;
    }
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.FlowLayout;
导入java.awt.GridLayout;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类游戏框架扩展了JFrame
{
专用部件栏;
private JPanel mainPanel=new JPanel();
private JPanel buttonPanel=new JPanel();
绿色=新颜色(29、180、29);
红色=新颜色(255,0,0);
私人生活;
私人矩形管死亡;
公共游戏框架(char x)
{
设置大小(1024768);
片名(“游戏”);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
创建面板(x);
buttonPanel.setLayout(新的FlowLayout(FlowLayout.LEFT,5,5));
设置布局(新的网格布局(0,2,5,5));
重新油漆();
getContentPane().add(主面板,BorderLayout.CENTER);
getContentPane().add(按钮面板,BorderLayout.PAGE_END);
setExtendedState(getExtendedState()| JFrame.MAXIMIZED_两者);
setLocationByPlatform(真);
setVisible(真);
}
公共矩形组件getLife()
{
回归生活;
}
私有void createHealth()
{
寿命=新矩形组件(绿色,真);
死亡=新矩形组件(红色,假);
}
私有void createPanels(char x)
{
createBar(x);
createHealth();
主面板。添加(按钮面板);
主面板。添加(寿命);
主面板。添加(死亡);
buttonPanel.add(bar.getSpell1());
buttonPanel.add(bar.getSpell2());
buttonPanel.add(bar.getSpell3());
}
私有void createBar(char x)
{
条形=新的部件(x);
}
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.geom.RoundRectangle2D;
导入javax.swing.JComponent;
导入javax.swing.JLabel;
公共类矩形组件扩展了JComponent
{
私人色彩;
私有整数宽度;
私人内部高度;
专用圆形矩形2D圆形矩形;
私人内部原始宽度;
私人标签;
私有布尔wantLabel;
公共矩形组件(颜色、整数宽度、整数高度、布尔wantLabel)
{
这个。宽度=宽度;
高度=高度;
这个颜色=颜色;
origWidth=宽度;
this.wantLabel=wantLabel;
如果(wantLabel)
{
标签=新的JLabel(this.width+“/”+origWidth);
label.setLabelFor(本);
}
}
公共矩形组件(颜色、布尔wantLabel)
{
宽度=125;
高度=18;
这个颜色=颜色;
origWidth=宽度;
this.wantLabel=wantLabel;
如果(wantLabel)
{
标签=新的JLabel(this.width+“/”+origWidth);
label.setLabelFor(本);
}
}
公共组件(图形g)
{
Graphics2D graphics2=(Graphics2D)g;
roundedRectangle=新的RoundRectangle2D.Float(10,10,宽度,高度,10,10);
图形2.设置油漆(颜色);
图2.填充(圆角转角);
图形2.绘制(圆形直角);
如果(wantLabel)
label.setText(this.width+“/”+origWidth);
}
公共维度getPreferredSize()
{
返回(新尺寸(宽度、高度));
}
公共生活(整笔金额)
{
宽度-=数量;
如果(宽度>0)
{
setRoundRect(10,10,宽度,高度,10,10);
重新油漆();
}
其他的
宽度=0;
}
公共生活费用(整笔金额)
{
宽度+=数量;
如果(宽度<起始宽度)
{
setRoundRect(10,10,宽度,高度,10,10);
重新油漆();
}
else宽度=初始宽度;
}
}

组件的边界由父组件的布局管理器覆盖。由于
主面板
使用的是
网格布局
,因此其中的所有组件将位于不同的网格单元中。如果要手动定位这些组件,请将
mainPanel
的布局管理器设置为
null

您还可以覆盖布局管理器的setBounds()以接受布尔值(或任何您想要的值),然后根据isStackable()或组件返回的任何值进行布局或不进行布局。通过这种方式,您可以在UI的其余部分保持GridLayout的行为,并且只允许在必要时进行堆叠。@Russell Zahniser好吧,当我将布局设置为null时,矩形不会出现。哎呀,您还需要调用
setBounds(0,0,width,heihgt)
RectangleComponent
构造函数中手动设置其位置。@Russel Zahniser,由于某种原因,现在矩形的底边被切断,仅显示高度的3/4左右。看起来好像有一张白色的空白纸,矩形的底部隐藏在下面。当我增加矩形的高度时,将显示矩形的比例量,并在底部切断比例量。有什么想法吗?你可能想做
setRoundRect(0,0,…)
而不是
(10,10…
,因为现在组件的位置是(10,10),矩形应该在其中的(0,0)。