Как правильно центрировать JPanel (ФИКСИРОВАННЫЙ РАЗМЕР) внутри JFrame?

Всем привет! Я пытаюсь решить, казалось бы, простую проблему, но не могу ее исправить. Я работаю над примером приложения с библиотеками Java / Swing; У меня есть JFrame и JPanel. Я просто хочу достичь следующих целей:

  1. JPanel ДОЛЖЕН быть центрирован внутри JFrame.

  2. JPanel ДОЛЖЕН иметь ВСЕГДА размер, указанный в
    setPreferredSize () метод. Его размер НЕ ДОЛЖЕН быть меньше этого размера.

Я пробовал использовать GridBagLayout: это ТОЛЬКО способ, которым я могу это сделать.

См. Пример ниже:

/* 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);

    }
}

Вот снимок экрана:

Я бы не стал использовать GridBagLayout, чтобы делать слишком простые вещи. Я попробовал простейшее решение, используя Box, но это не работает:

Пример кода:

/* 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);

    }
}

Здесь скриншот,

Есть идеи? Спасибо всем: -)

16
задан Alberto Solano 28 August 2011 в 20:36
поделиться