0

GameFrame に 2 つのrectangleComponents を作成しましたが、コンポーネントが同じ 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;
    }
}
4

1 に答える 1

2

コンポーネントの境界は、親コンポーネントのレイアウト マネージャーによってオーバーライドされます。mainPanelは を使用しているため、GridLayoutその中のすべてのコンポーネントは異なるグリッド セルになります。これらのコンポーネントを手動で配置する場合は、レイアウト マネージャを に設定しmainPanelますnull

于 2012-04-24T16:47:00.667 に答える