2

我正在为战术构建一个小棋盘,这将是一种反思兴趣(编程和国际象棋)的有趣方式。

我目前面临的一个问题虽然已解决,但仍是保持 1:1 的板长宽比。

Board延伸JPanel。_ 由于约束问题,我选择保持电路板的物理尺寸而不是渲染尺寸。这将导致实际使用时更快的操作。

我希望它看起来像什么,并实现了:

水平缓冲 垂直缓冲

我实现这一点的方式虽然看起来很老套,而且按照 Skeet 标准来说是糟糕的代码(谢谢基于 Skeet)。

public Frame() {
    final JFrame frame = new JFrame("Chess");
    final JPanel content = new JPanel(new BorderLayout());
    final JPanel boardConfine = new JPanel(new BorderLayout());
    final Board board = new Board();

    boardConfine.addComponentListener(new ComponentAdapter() {
        @Override
        public void componentResized(ComponentEvent e) {
            int min = Math.min(boardConfine.getWidth(), boardConfine.getHeight());
            int xBuffer = (boardConfine.getWidth() - min) / 2;
            int yBuffer = (boardConfine.getHeight() - min) / 2;
            board.setBounds(xBuffer, yBuffer, min, min);

        }

    });
    boardConfine.add(board, BorderLayout.CENTER);
    content.setBackground(new Color(205, 205, 205));
    content.add(boardConfine, BorderLayout.CENTER);

    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setContentPane(content);
    frame.pack();
    frame.setVisible(true);
}

如上所示,我手动设置了电路板的大小和位置。即使我已经详尽地声明过这不应该这样做,但我找不到工作的解决方案。我需要电路板填充最大可能的区域,但保持纵横比。

如果您可以提供任何建议(代码或概念),我非常感谢您抽出时间帮助我解决这个精英难题。

4

1 回答 1

2

虽然不是一个完整的解决方案,但下面的示例将板缩放以填充封闭容器的最小尺寸。调整框架大小以查看效果。

附录:理想的解决方案是创建自定义布局管理器,您可以在其中访问封闭容器的几何图形,并且setBounds()可以保持所需的 1:1 纵横比。的变化GridLayout可能是合适的。可以直接计算网格坐标,如下所示

测试图像

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * @see https://stackoverflow.com/a/19531648/230513
 */
public class Test {

    private static class MyPanel extends JPanel {

        private static final int N = 8;
        private static final int TILE = 48;

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(N * TILE, N * TILE);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.gray);
            int w = this.getWidth();
            int h = this.getHeight();
            int tile = Math.min(w, h) / N;
            for (int row = 0; row < N; row++) {
                for (int col = 0; col < N; col++) {
                    if ((row + col) % 2 == 0) {
                        g.fillRect(col * tile, row * tile, tile, tile);
                    }
                }
            }
        }
    }

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new MyPanel());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}
于 2013-10-23T02:21:23.507 回答