I create two rectangleComponents in my GameFrame but they are never at the same location, despite the components being constructed with the same X,Y Coords. Anyone know how to fix this? I also make a JLabel on the top green rectangle, but it never shows up.
Thank you for your time.
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;
}
}
The bounds of a component are overridden by the layout manager of the parent component. Since
mainPanelis using aGridLayout, all components in it will be in different grid cells. If you want to manually position these components, set the layout manager ofmainPaneltonull.