NetBeans, конструктор графического интерфейса пользователя (групповая компоновка), центрирующий компонент

#java #swing #netbeans #grouplayout

#java #swing #netbeans #групповое воспроизведение

Вопрос:

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

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

Ответ №1:

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

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

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

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

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

Скриншот NetBeans

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

Скриншот NetBeans

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

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

Компоненты могут быть центрированы в параллельной группе путем передачи 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);
            }
        });
    }
}
  

введите описание изображения здесь

Ответ №2:

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

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

1. случай (я думаю, это очень часто) заключается в том, что у вас есть форма со многими элементами управления. Расположение элементов управления делает groupplayout идеальным выбором. За исключением кнопки в конце, она должна быть центрирована. Конечно, я могу поместить JPanel в конец страницы, изменить ее размер по горизонтали и поместить в ее (по умолчанию) центрированное потоковое представление JButton. Но вопрос возникает из-за того факта, что в других сборщиках GUI (не таких сложных), таких как Delphi, центрирование является прямым расширением логики привязки. Не привязывать элемент управления к любому месту означает, что он «плавает» в центре.

2. @AgostinoX у вас будет много сюрпризов с этим LayoutManager Pete 1

3. @mKorbel, я не очень рад это слышать :-). можете ли вы предоставить несколько примеров?

4. для чего, о чем 1) проверьте судно на воздушной подушке, полное истории Угрей, ему нравится этот LayoutManager 2) Я знаю, что детские, но базовые примеры из download.oracle.com/javase/tutorial/uiswing/layout/index.html показывает все возможное :-), 3) java2s.com/Tutorial/Java/0240__Swing/1460__GridBagLayout.htm , 4) java2s.com/Tutorial/Java/0240__Swing /… ,

5. @AgostinoX эта тема Centering JComponent решается много раз на этом форуме,

Ответ №3:

Попробуйте GridbagLayout увидеть это

Ответ №4:

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

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

 DesignGridLayout layout = new DesignGridLayout(container);
layout.row().center().add(okButton);
  

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

1. @ jfpoilpret: предоставляет ли он конструктор графического интерфейса?

2. При использовании DesignGridLayout нет необходимости в построителе графического интерфейса пользователя, в этом его сила! Код, который вы пишете, непосредственно выражает желаемый макет. И просто чтение кода дает вам немедленное представление о полученном макете. Нет GUI builder, нет уродливой или сложной генерации кода, что значительно упрощает обслуживание в дополнение к упрощению начального кодирования. API DesignGridLayout очень прост, вы можете понять, как его использовать, и создавать свои собственные макеты, прочитав введение и примеры на веб-сайте всего за один или два часа.

Ответ №5:

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

Что касается использования другого LayoutManager, я знаю, что людям не нравится groupplayout, потому что это не способствует ручному кодированию. Это сделано специально. Как говорится в документах, groupplayout предназначен для использования разработчиками графического интерфейса. Итак, пока вы согласны с привязкой себя к использованию NetBeans amp; Matisse для жизни вашего GUI, groupplayout действительно лучший вариант.