NetBeans, GUI Builder (групповая разметка), центрирующий компонент - PullRequest
6 голосов
/ 10 октября 2011

Я пытаюсь спроектировать JButton (кнопка «ОК»), чтобы он хорошо выглядел, должен быть горизонтально центрирован в содержащем JFrame.Я использую GUI Builder с макетом свободной формы (GroupLayout).

Я взял несколько учебных пособий по GUI (http://netbeans.org/kb/docs/java/quickstart-gui.html)), но не нашел эту тему. В других сборщиках GUI (delphi) это можно сделать, удалив привязки с обоих краев.

Ответы [ 5 ]

5 голосов
/ 10 октября 2011

Если вы хотите, чтобы ваш компонент оставался по центру в своем контейнере, если размер контейнера изменен, у вас есть несколько доступных вариантов, но я не думаю, что GroupLayout является одним из них (пожалуйста, исправьте меня, если я ошибаюсь) , Один из способов - изменить макет контейнера на GridBagLayout, а затем просто добавить в него JButton без каких-либо ограничений.

4 голосов
/ 07 августа 2014

GroupLayout поддерживает центрирование компонентов.Это очень способный менеджер макетов.Я лично поставил его после MigLayout менеджера и до FormLayout менеджера.

В следующих трех примерах у нас есть панель и кнопка.Кнопка расположена по центру по горизонтали.

Центрирование с помощью NetBeans Builder

Чтобы центрировать компонент с помощью построителя Netbeans, нам необходимо создать горизонтальные изменяемые размеры пробелыс обеих сторон кнопки.

Зеленая область скриншота - это выбранные в данный момент пробелы.Строки внутри пробелов предполагают, что это пробел с изменяемыми размерами.

NetBeans screenshot

Пробелы добавляются автоматически, когда мы помещаем компоненты в форму.Чтобы определить разрыв для изменения размера, мы щелкаем правой кнопкой мыши на разрыве и выбираем опцию «Редактировать пространство макета».Мы получаем следующий диалог:

NetBeans screenshot

Чтобы получить разрыв с изменяемым размером, мы устанавливаем флажок Resizable.

Центрирование вручную с использованием параллельной группы

Компоненты можно центрировать в параллельной группе, передавая параметр GroupLayout.Alignment.CENTER.

package com.zetcode;

import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import static javax.swing.GroupLayout.Alignment.CENTER;
import static javax.swing.GroupLayout.DEFAULT_SIZE;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GroupLayoutCenter extends JFrame {

    public GroupLayoutCenter() {

        initUI();

        setTitle("Centered button");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);        
    }

    private void initUI() {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);    

        gl.setAutoCreateGaps(true);
        gl.setAutoCreateContainerGaps(true);

        JPanel pnl = new JPanel();
        pnl.setBorder(BorderFactory.createEtchedBorder());

        JButton btn = new JButton("Button");

        gl.setHorizontalGroup(gl.createParallelGroup(CENTER)
           .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
           .addComponent(btn)
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
           .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
           .addComponent(btn)            
        );          

        pack();
    }


    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                GroupLayoutCenter ex = new GroupLayoutCenter();
                ex.setVisible(true);
            }
        });
    }
}

Центрирование вручную с использованием пробелов

Это решение - то, что делает сгенерированный код NetBeans.Мы размещаем два изменяемых разрыва слева и справа от кнопки.

package com.zetcode;

import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import static javax.swing.GroupLayout.DEFAULT_SIZE;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GroupLayoutCenter2 extends JFrame {

    public GroupLayoutCenter2() {

        initUI();

        setTitle("Centered button");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);        
    }

    private void initUI() {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);    

        gl.setAutoCreateGaps(true);
        gl.setAutoCreateContainerGaps(true);

        JPanel pnl = new JPanel();
        pnl.setBorder(BorderFactory.createEtchedBorder());

        JButton btn = new JButton("Button");

        gl.setHorizontalGroup(gl.createParallelGroup()
                .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
                .addGroup(gl.createSequentialGroup()
                        .addGap(5, 100, Short.MAX_VALUE)
                        .addComponent(btn)
                        .addGap(5, 100, Short.MAX_VALUE))
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
                .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
                .addComponent(btn)
        );    

        pack();
    }


    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                GroupLayoutCenter2 ex = new GroupLayoutCenter2();
                ex.setVisible(true);
            }
        });
    }
}

enter image description here

2 голосов
/ 26 марта 2012

javax.swing.Box.Filler можно использовать для заполнения пространства вокруг компонента внутри GroupLayout.В NetBeans Matisse (GUI Builder) они называются «Горизонтальная распорка» в разделе «Swing Fillers» палитры.Просто поместите по одному с каждой стороны вашей кнопки, измените их размер, чтобы заполнить все пустое пространство между кнопкой и краем контейнера, и убедитесь, что они оба помечены как Auto Resize Horizontally.

Что касается использованиядругой LayoutManager, я знаю, что людям не нравится GroupLayout, потому что он не способствует ручному кодированию.Это по замыслу.Как говорят docs , GroupLayout предназначен для использования создателями графического интерфейса.Так что, если вы согласны использовать NetBeans & Matisse для жизни вашего графического интерфейса, GroupLayout - действительно лучший вариант.

2 голосов
/ 10 октября 2011

Попробуйте другой LayoutManager!GroupLayout очень неясен, когда просто просматривает код, сгенерированный NetBeans.

Если вы использовали DesignGridLayout , то вам нужно просто:

DesignGridLayout layout = new DesignGridLayout(container);
layout.row().center().add(okButton);
2 голосов
/ 10 октября 2011

Попробуйте GridbagLayout См. это

...