如何解决带有 GridBagLayout 的 JPanels 大小不正确
我正在尝试设置一个拼图编辑器/解算器,左侧有一个可交互的画布,右上角有可选工具,一个大的“解决”按钮和右下角的一些重播按钮。我使用了几个 GridBagLayouts(一个用于主布局,一个用于按钮),并且在这两个地方看起来大小和边距都没有正确计算。
我想要的是内容周围的 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 举报,一经查实,本站将立刻删除。