有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (2) 个答案

  1. # 1 楼答案

    为了进一步阐述kaetzacoatl的评论,您根本不应该为此使用LayoutManager,原因如下:

    • 对于更复杂的设置,它们没有灵活性
    • 对于元素的非平凡运动,很难使用它们
    • 它们主要适用于可以调整大小、包装或拉伸的元素,我认为这对益智游戏中的瓷砖没有意义

    相反,我建议使用画布之类的东西,用坐标画出你的拼图

  2. # 2 楼答案

    恕我直言,使用布局和组件并不能很好地解决您的问题,我个人倾向于使用定制的绘画解决方案

    从一件作品的基本概念开始,它需要知道它的位置,大小,颜色,能够自己画,可能可以重新定位,比如

    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));
        }
    
    }
    

    这只是一个基本的正方形,没有什么特别之处,但它是独立的,易于创建和管理。你可以使用这个简单的模式创建任意形状的组合,最终,你的board类不会在意,它只需要知道它所占的空间以及如何绘制它,说到这里,你需要某种容器来管理所有这些形状

    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 examplethis example的想法结合起来,您现在可以拖动形状了