Como posso centralizar adequadamente um JPanel (FIXED SIZE) dentro de um JFram

Olá a todos! Estou tentando resolver um problema aparentemente simples, mas não consigo corrigi-lo. Estou trabalhando em um aplicativo de amostra com bibliotecas Java / Swing; Eu tenho um JFrame e um JPanel. Eu só quero alcançar os seguintes objetivos:

JPanelDEV centralizado dentro do JFram

JPanelDEV terSEMPR o tamanho especificado com
setPreferredSize (). NÃO DEVE ser redimensionado com esse tamanho.

Tentei usar um GridBagLayout: é oS maneira que eu posso fazê-lo.

Veja a amostra abaixo:

/* file StackSample01.java */

import java.awt.*;
import javax.swing.*;

public class StackSample01 {
    public static void main(String [] args) {

        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(100, 100));
        panel.setBackground(Color.RED);  

        frame.setLayout(new GridBagLayout());
        frame.add(panel, new GridBagConstraints());
        frame.setSize(new Dimension(200, 200));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
}

Aqu uma captura de tela:

Eu não usaria um GridBagLayout para fazer algo muito simples. Tentei uma solução mais simples, usando uma caixa, mas isso não funciona:

Código de amostra

/* file StackSample02.java */

import java.awt.*;
import javax.swing.*;

public class StackSample02 {
    public static void main(String [] args) {

        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(100, 100));
        panel.setBackground(Color.RED); // for debug 

        panel.setAlignmentX(JComponent.CENTER_ALIGNMENT); // have no effect

        Box box = new Box(BoxLayout.Y_AXIS);

        box.add(Box.createVerticalGlue());
        box.add(panel);     
        box.add(Box.createVerticalGlue()); // causes a deformation

        frame.add(box);
        frame.setSize(new Dimension(200, 200));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
}

Aqu uma captura de tela,

Alguma ideia? Obrigado a todos: -)

questionAnswers(2)

yourAnswerToTheQuestion