微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 GridBagLayout 的 JPanels 大小不正确

如何解决带有 GridBagLayout 的 JPanels 大小不正确

我正在尝试设置一个拼图编辑器/解算器,左侧有一个可交互的画布,右上角有可选工具,一个大的“解决”按钮和右下角的一些重播按钮。我使用了几个 GridBagLayouts(一个用于主布局,一个用于按钮),并且在这两个地方看起来大小和边距都没有正确计算。

这是它显示内容图片

https://i.stack.imgur.com/tu6RC.png

我想要的是内容周围的 10 像素边距,以及每个右侧部分内的 10 像素边距,但它给了我顶部 15 像素的边距,天知道在什么底部和侧面。子 JPanel 的大小也不正确,因为您可以看到内容对于窗口来说太大了。我为单选按钮使用了一个简单的框布局,并且那里的大小或边距似乎没有任何问题。我使用预期的像素值作为网格权重,因为在我看来,这应该正确调整它们的大小。任何想法为什么边距和尺寸完全被破坏?

附上相关代码。 EditorToolsGroup 是创建单选按钮的子组件。 SolveButtons 是创建求解/重播按钮的子组件。如果需要,我可以包含 SolveButtons 的代码,但实际上并没有什么不同。

public class Editor implements ActionListener {
    private static final String WINDOW_TITLE = "Golem Puzzle Editor";

    private static final int WINDOW_WIDTH = 1500;
    private static final int WINDOW_HEIGHT = 800;
    private static final int WINDOW_MARGIN = 10;
    private static final int CONTROLS_WIDTH = 180;
    private static final int SOLVE_BUTTONS_HEIGHT = 100;
    private static final int RAdio_BUTTONS_HEIGHT = WINDOW_HEIGHT - SOLVE_BUTTONS_HEIGHT - 2*WINDOW_MARGIN;
    private static final int CANVAS_WIDTH = WINDOW_WIDTH - CONTROLS_WIDTH - 2*WINDOW_MARGIN;
    private static final int CANVAS_HEIGHT = WINDOW_HEIGHT - 2*WINDOW_MARGIN;

    private JFrame window;
    private EditorCanvas canvas;

    public Editor() {
        this.window = new JFrame(WINDOW_TITLE);
        this.window.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        this.window.setSize(WINDOW_WIDTH,WINDOW_HEIGHT);

        JPanel mainPanel = new JPanel();
        Border margin = new EmptyBorder( WINDOW_MARGIN,WINDOW_MARGIN,WINDOW_MARGIN);
        mainPanel.setBorder(margin);
        this.window.add(mainPanel);
        JPanel subPanel = new JPanel();
        subPanel.setLayout(new GridBagLayout());
        mainPanel.add(subPanel);

        this.setupCanvas(subPanel);
        this.createradioButtons(subPanel);
        this.createSolveButtons(subPanel);

        this.window.setVisible(true);
    }

    private void setupCanvas(JPanel parent) {
        this.canvas = new EditorCanvas();
        this.canvas.setBackground(Color.RED);
        this.canvas.setPreferredSize(new Dimension(CANVAS_WIDTH,CANVAS_HEIGHT));

        GridBagConstraints canvasConstraints = new GridBagConstraints();
        canvasConstraints.fill = GridBagConstraints.BOTH;
        canvasConstraints.gridwidth = 1;
        canvasConstraints.gridheight = 2;
        canvasConstraints.gridx = 0;
        canvasConstraints.gridy = 0;
        canvasConstraints.weightx = CANVAS_WIDTH;
        canvasConstraints.weighty = CANVAS_HEIGHT;
        parent.add(this.canvas,canvasConstraints);
    }

    private void createradioButtons(JPanel parent) {
        EditorToolsGroup editorToolsGroup = new EditorToolsGroup(this);
        JPanel editorToolsGroupPanel = editorToolsGroup.getPanel();
        editorToolsGroupPanel.setBackground(Color.GREEN);
        editorToolsGroupPanel.setPreferredSize(new Dimension(CONTROLS_WIDTH,RAdio_BUTTONS_HEIGHT));

        GridBagConstraints toolsGroupConstraints = new GridBagConstraints();
        toolsGroupConstraints.fill = GridBagConstraints.BOTH;
        toolsGroupConstraints.gridwidth = 1;
        toolsGroupConstraints.gridheight = 1;
        toolsGroupConstraints.gridx = 1;
        toolsGroupConstraints.gridy = 0;
        toolsGroupConstraints.weightx = CONTROLS_WIDTH;
        toolsGroupConstraints.weighty = RAdio_BUTTONS_HEIGHT;
        parent.add(editorToolsGroupPanel,toolsGroupConstraints);
    }

    private void createSolveButtons(JPanel parent) {
        SolveButtons solveButtons = new SolveButtons(this);
        JPanel solveButtonsPanel = solveButtons.getPanel();
        solveButtonsPanel.setBackground(Color.BLUE);
        solveButtonsPanel.setPreferredSize(new Dimension(CONTROLS_WIDTH,SOLVE_BUTTONS_HEIGHT));

        GridBagConstraints buttonConstraints = new GridBagConstraints();
        buttonConstraints.fill = GridBagConstraints.BOTH;
        buttonConstraints.gridwidth = 1;
        buttonConstraints.gridheight = 1;
        buttonConstraints.gridx = 1;
        buttonConstraints.gridy = 1;
        buttonConstraints.weightx = CONTROLS_WIDTH;
        buttonConstraints.weighty = SOLVE_BUTTONS_HEIGHT;
        parent.add(solveButtonsPanel,buttonConstraints);
    }

    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        // Todo
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。