在这个游戏上使用哪个布局管理器?
Which layout manager to use on this game?
在这个游戏中使用哪个布局管理器?
为了扩展 kaetzacoatl 的评论,您根本不应该为此使用 LayoutManager,原因如下:
- 他们不具备进行更复杂设置的灵活性。
- 它们很难non-trivial移动元素。
- 它们主要对可以调整大小并可能包裹或拉伸的元素有意义,我认为这对益智游戏中的图块没有意义。
相反,我建议使用 canvas 之类的东西并用坐标绘制拼图。
恕我直言,使用布局和组件并不是解决您问题的好方法,就我个人而言,我倾向于使用自定义绘画解决方案。
从一件作品的基本概念开始,它需要知道它的位置、大小、颜色,能够自己绘画并可能重新定位,比如...
public interface Piece {
public Rectangle getBounds();
public Color getColor();
public void setLocation(Point point);
public void paint(Graphics2D g2d);
}
由此,您可以定义您需要的任何形状,例如...
public abstract class AbstractPiece implements Piece {
private Rectangle bounds;
private Color color;
@Override
public void setLocation(Point point) {
bounds.setLocation(point);
}
@Override
public Rectangle getBounds() {
return bounds;
}
@Override
public Color getColor() {
return color;
}
public void setBounds(Rectangle bounds) {
this.bounds = bounds;
}
public void setColor(Color color) {
this.color = color;
}
}
public class Square extends AbstractPiece {
public Square(Point location, int size, Color color) {
Rectangle bounds = new Rectangle();
bounds.setLocation(location);
bounds.setSize(size, size);
setBounds(bounds);
setColor(color);
}
@Override
public void paint(Graphics2D g2d) {
g2d.setColor(getColor());
g2d.fill(getBounds());
g2d.setColor(Color.GRAY);
Rectangle bounds = getBounds();
g2d.drawLine(bounds.x + (bounds.width / 2), bounds.y, bounds.x + (bounds.width / 2), bounds.y + bounds.height);
g2d.drawLine(bounds.x, bounds.y + (bounds.height / 2), bounds.x + bounds.width, bounds.y + (bounds.height / 2));
}
}
这只是一个基本的方形,没有什么花哨的东西,但是它是独立的,易于创建和管理。您可以使用这个简单的图案创建任何您喜欢的形状组合,在一天结束时,您的板 class 不会关心,它只需要它占据的 space 以及如何绘制它,为此,您需要某种容器来管理所有这些形状...
public class PuzzelPane extends JPanel {
private List<Piece> pieces;
public PuzzelPane() {
Dimension size = getPreferredSize();
pieces = new ArrayList<>(25);
Point location = new Point((size.width - 50) / 2, (size.width - 50) / 2);
pieces.add(new Square(location, 50, Color.BLUE));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Piece piece : pieces) {
Graphics2D g2d = (Graphics2D) g.create();
piece.paint(g2d);
g2d.dispose();
}
}
}
这是一个非常简单的概念,它有一个 List
来维护所有可用的形状,并简单地循环它以在 paintComponent
方法
中绘制它们
将它与 this example and 的想法相结合,您现在可以拖动形状
在这个游戏中使用哪个布局管理器?
为了扩展 kaetzacoatl 的评论,您根本不应该为此使用 LayoutManager,原因如下:
- 他们不具备进行更复杂设置的灵活性。
- 它们很难non-trivial移动元素。
- 它们主要对可以调整大小并可能包裹或拉伸的元素有意义,我认为这对益智游戏中的图块没有意义。
相反,我建议使用 canvas 之类的东西并用坐标绘制拼图。
恕我直言,使用布局和组件并不是解决您问题的好方法,就我个人而言,我倾向于使用自定义绘画解决方案。
从一件作品的基本概念开始,它需要知道它的位置、大小、颜色,能够自己绘画并可能重新定位,比如...
public interface Piece {
public Rectangle getBounds();
public Color getColor();
public void setLocation(Point point);
public void paint(Graphics2D g2d);
}
由此,您可以定义您需要的任何形状,例如...
public abstract class AbstractPiece implements Piece {
private Rectangle bounds;
private Color color;
@Override
public void setLocation(Point point) {
bounds.setLocation(point);
}
@Override
public Rectangle getBounds() {
return bounds;
}
@Override
public Color getColor() {
return color;
}
public void setBounds(Rectangle bounds) {
this.bounds = bounds;
}
public void setColor(Color color) {
this.color = color;
}
}
public class Square extends AbstractPiece {
public Square(Point location, int size, Color color) {
Rectangle bounds = new Rectangle();
bounds.setLocation(location);
bounds.setSize(size, size);
setBounds(bounds);
setColor(color);
}
@Override
public void paint(Graphics2D g2d) {
g2d.setColor(getColor());
g2d.fill(getBounds());
g2d.setColor(Color.GRAY);
Rectangle bounds = getBounds();
g2d.drawLine(bounds.x + (bounds.width / 2), bounds.y, bounds.x + (bounds.width / 2), bounds.y + bounds.height);
g2d.drawLine(bounds.x, bounds.y + (bounds.height / 2), bounds.x + bounds.width, bounds.y + (bounds.height / 2));
}
}
这只是一个基本的方形,没有什么花哨的东西,但是它是独立的,易于创建和管理。您可以使用这个简单的图案创建任何您喜欢的形状组合,在一天结束时,您的板 class 不会关心,它只需要它占据的 space 以及如何绘制它,为此,您需要某种容器来管理所有这些形状...
public class PuzzelPane extends JPanel {
private List<Piece> pieces;
public PuzzelPane() {
Dimension size = getPreferredSize();
pieces = new ArrayList<>(25);
Point location = new Point((size.width - 50) / 2, (size.width - 50) / 2);
pieces.add(new Square(location, 50, Color.BLUE));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Piece piece : pieces) {
Graphics2D g2d = (Graphics2D) g.create();
piece.paint(g2d);
g2d.dispose();
}
}
}
这是一个非常简单的概念,它有一个 List
来维护所有可用的形状,并简单地循环它以在 paintComponent
方法
将它与 this example and