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));
}
}
# 1 楼答案
为了进一步阐述kaetzacoatl的评论,您根本不应该为此使用LayoutManager,原因如下:
相反,我建议使用画布之类的东西,用坐标画出你的拼图
# 2 楼答案
恕我直言,使用布局和组件并不能很好地解决您的问题,我个人倾向于使用定制的绘画解决方案
从一件作品的基本概念开始,它需要知道它的位置,大小,颜色,能够自己画,可能可以重新定位,比如
由此,您可以定义所需的任何形状,例如
这只是一个基本的正方形,没有什么特别之处,但它是独立的,易于创建和管理。你可以使用这个简单的模式创建任意形状的组合,最终,你的board类不会在意,它只需要知道它所占的空间以及如何绘制它,说到这里,你需要某种容器来管理所有这些形状
这是一个非常简单的概念,它有一个
List
来维护所有可用的形状,并简单地在它上面循环以在paintComponent
方法中绘制它们将它与来自this example和this example的想法结合起来,您现在可以拖动形状了