我有一个棋盘游戏(认为是专卖),可以在单个图块上放置多个游戏块。我希望能够任意将游戏块放置在任何给定的图块上。我希望图块具有背景(图像或仅是纯色),并且能够在网格中的图块上放置多达4个游戏块。我目前正在使用此代码,但圆圈不会显示。
tank.png是135 x 135像素的背景。
GraphicsTile:
public class GraphicsTile extends JPanel {
public static final Dimension SIZE = new Dimension(135, 135);
public static final GridLayout MGR = new GridLayout(4, 4);
public GraphicsTile() {
super();
setLayout(MGR);
initGraphics();
setSize(SIZE);
add(new CirclePanel());
}
private void initGraphics() {
JLabel panel = null;
try {
Image image = ImageIO.read(new File("tank.png"));
panel = new JLabel(new ImageIcon(image));
panel.setSize(SIZE);
} catch (IOException e) {
e.printStackTrace();
}
add(panel);
}
}
CirclePanel:
public class CirclePanel extends JPanel {
public CirclePanel() {
setSize(33, 33);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(Color.RED);
Ellipse2D.Float circle = new Ellipse2D.Float(50, 50, 0, 0);
g2d.draw(circle);
g2d.fill(circle);
}
}
答案 0 :(得分:1)
public class GraphicsTile {
我不知道您的代码如何编译,因为GraphicsTile不会扩展任何Swing组件,但是您使用的是setLayout(...)
和setSize(...)
之类的方法,这意味着您试图像JPanel一样使用它。
您不应该使用setSize(...)。 Swing组件应具有首选的大小。然后,布局管理器将根据布局管理器的规则设置组件的大小和位置。我猜您有问题,因为首选大小是(0,0)。
我也不知道如何将GraphicsTile添加到父组件。同样,当您应该让布局管理器在游戏板上放置图块时,您似乎正在使用setSize()。
此外,如果要在背景图像的顶部加上圆圈,则需要分层结构。那就是你需要的东西:
所以我的建议是:
CirclePanel
需要实现getPreferredSize(...)
方法以返回自定义绘画的大小。
您的GraphicsTile
类需要扩展JPanel
。然后,您将覆盖paintComponent(...)
方法以绘制背景图像。现在,您可以将CirclePanel
实例添加到将使用GridLayout
的此面板中。