Java JFrame.setSize 给出错误的大小

问题描述 投票:0回答:1

我正在尝试使用 java 中的 swing 库创建一个窗口。 一切正常,除了一个小问题(但非常烦人):

private void init()
    {
        board = new Board();
        currTurn = Piece.WHITE;
        movesPlayed = new ArrayList<Move>();

        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Chessboard");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            frame.setSize(640, 640);
            frame.setResizable(false);  
            frame.setLocationRelativeTo(null);

            Chessboard chessboard = new Chessboard(board);
            frame.add(chessboard);

            frame.setVisible(true);
        });
    }

在上面的代码中,我使用 setSize 将其设置为

640, 640
。我添加了一个侦听器来验证大小。但是当我运行该应用程序时,(由我的听众)打印的尺寸是:

Window size: 624x601

我知道这可能与窗饰有关。我能以某种方式计算我需要添加的大小以获得我真正想要的窗口大小吗?

提前致谢!

java swing
1个回答
0
投票

答案是,这取决于。

JFrame#pack
将根据布局管理器 API 确定的内容的“首选”大小“打包”可视内容周围的窗口装饰。

所以,如果您使用某种自定义组件来生成单元格,那么您将需要提供适当的尺寸提示,例如...

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

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new Board());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class Board extends JPanel {
        public Board() {
            setLayout(new GridLayout(8, 8));
            for (int row = 0; row < 8; row++) {
                int cellIndex = (row % 2 == 0) ? 0 : 1;
                for (int col = 0; col < 8; col++) {
                    Cell cell = new Cell();
                    cell.setBackground((cellIndex % 2 == 0) ? Color.WHITE : Color.BLACK);
                    add(cell);
                    cellIndex++;
                }
            }
        }
    }

    public class Cell extends JPanel {
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(80, 80);
        }
    }
}

现在,这将允许调整窗口大小并使单元格大小不均匀。您可以通过在

frame.setLayout(new GridBagLayout());
之前添加
frame.add(new Board());
来解决此问题,但还要记住,组件具有“最小”尺寸,因此如果您将窗口尺寸缩小

,您可能会感到惊讶
© www.soinside.com 2019 - 2024. All rights reserved.