javaswinglayout-managermiglayout

Java Swing - MigLayout: Docking a component in center isn't fully centering


I am attempting to design a panel with MiGFormat that has a label at the top, and two buttons at the bottom - a yes/no prompt.

I achieve this closely, but the label yesOrNoText (text is "TEST") is not fully centered: enter image description here

I initialize the panel containing this prompt like so:

private JPanel createYesNoPrompt() {
    JPanel panel = new JPanel(new MigLayout());
    panel.setBorder(BorderFactory.createLineBorder(Color.red));
    JButton yesButton = new JButton("Yes");
    JButton noButton = new JButton("No");
    yesOrNoText = new JLabel();
    yesOrNoText.setText("TEST");
    yesOrNoText.setFont(panel.getFont().deriveFont(Font.BOLD, 30f));
    yesOrNoText.setHorizontalAlignment(SwingConstants.CENTER);
    Dimension dimension = new Dimension(500, 125);
    Font font = panel.getFont().deriveFont(Font.BOLD, 20f);
    yesButton.setFont(font);
    yesButton.setBackground(new Color(35, 138, 35));
    yesButton.setPreferredSize(dimension);
    noButton.setFont(font);
    noButton.setBackground(new Color(183, 19, 19));
    noButton.setPreferredSize(dimension);
    yesButton.addActionListener(e -> isYes = true);
    noButton.addActionListener(e -> isYes = false);
    panel.add(yesOrNoText, "wrap, dock center");
    panel.add(yesButton);
    panel.add(noButton);
    return panel;
}

Then, I add it to gamePanel, then gamePanel to mainPanel, then mainPanel to the frame.

gamePanel.add(YesOrNoPanel, "align center");
mainPanel.add(gamePanel);
add(mainPanel);

I'm unsure of what would be causing yesOrNoText to not become fully centered within the YesNoPanel. Please let me know if I need to clarify anything! Thank you.


Solution

  • I needed to make the add call for the yesNo label span 2 cells. By adding one component in the first row, then adding two in the next, I essentially created a 2x2 grid.

    panel.add(yesOrNoText, "wrap, align center, span 2 1");
    panel.add(yesButton);
    panel.add(noButton);
    

    Notice that on the first component I add yesOrNoText I use span to tell MiGFormat to take up two cells for this component. I can then center that with the remaining two components because it becomes the only component in the row.