Поиск по этому блогу

воскресенье, 2 ноября 2014 г.

Java расположение элементов в JPanel с помощью BoxLayout.

Допустим есть окно
Мы хотим добавить в него элементы.
Нам нужно две панели разного размера и чтобы они при изменении размеров окна пропорционально менялись. Для этого я использую BoxLayout компоновщик.
Сначала создаём само окно:


public class MainFrame extends JFrame {
    private JPanel mainPanel = new JPanel();
    private JPanel leftPanel = new JPanel();
    private JPanel rightPanel = new JPanel();
    public MainFrame(String title, GraphicsConfiguration gc) {
        super(title, gc);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setSize(getFrameSize());
        setLocationRelativeTo(null);
        setContentPane(mainPanel);
    }
    private Dimension getFrameSize(){
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int width = (int) (screenSize.getWidth() * 0.7);
        int height = (int) (screenSize.getHeight() * 0.5);
        return new Dimension(width, height);
    }
}
Я беру 70% ширины экрана и 50% высоты. Располагаю окно в центре.
Далее добавим в наш класс метод, который будет отрисовывать наши панельки.
private void renderMainPanel() {
    final int leftWidth = 250;
    Dimension frameSize = getFrameSize();
    Border b = new LineBorder(new Color(0, 255, 0), 1);
    mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.LINE_AXIS));
    leftPanel.setSize(new Dimension(leftWidth, frameSize.height));
    rightPanel.setSize(new Dimension(frameSize.width - leftWidth, frameSize.height)); 
    leftPanel.setBorder(b);
    rightPanel.setBorder(b);
    Box mainBox = Box.createHorizontalBox();
    mainBox.add(leftPanel);
    mainBox.add(rightPanel);
    mainPanel.add(mainBox);
И вызовем его выше  setContentPane(mainPanel) в конструкторе класса. Т.е. в конструктор должен принять следующий вид:
public MainFrame(String title, GraphicsConfiguration gc) {
    super(title, gc);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setSize(Screen.getFrameSize());
    setLocationRelativeTo(null);
    renderMainPanel();
    setContentPane(mainPanel);
}
 Запускаем и видим
Две панели одинаковой ширины. Но ведь мы вроде устанавливали ширину для левой панельки 250. Вернёмся в код и проверим.
leftPanel.setSize(new Dimension(leftWidth, frameSize.height));
rightPanel.setSize(new Dimension(frameSize.width - leftWidth, frameSize.height)); 
Все вроде бы нормально. Левая панелька должна быть 250, правая всё остальное место.
Есть тут на самом деле одна хитрость. Нужно установить PreferredSize панелям.

Меняем
leftPanel.setSize(new Dimension(leftWidth, frameSize.height));
rightPanel.setSize(new Dimension(frameSize.width - leftWidth, frameSize.height)); 
На
leftPanel.setPreferredSize(new Dimension(leftWidth, frameSize.height));
rightPanel.setPreferredSize(new Dimension(frameSize.width - leftWidth, frameSize.height));  
Проверяем
Готово.
Для добавления вертикальных панелей используйте 
Box mainBox = Box.createVerticalBox();

Комментариев нет:

Отправить комментарий

Количество·просмотров