Java: MiGLayout: Как использовать `hidemode`?

Я начинаю использовать MiGLayout для моего графического интерфейса, и одна из функций, которые мне нужны, это показать/скрыть некоторые компоненты основанный на состоянии других компонентов.

Я собирался кодировать это сам, когда заметил, что одна из Компонентных ограничений, поддерживаемая MiGLayout, - hidemode.

Делает ли это то, что я думаю, что он делает? Если да, то каким образом я могу вызвать действие hide/unhide, если был установлен параметр hidemode? (Просмотрев документацию, я смог узнать, как установить hidemode, но не так, как он будет использоваться после этого)


hidemode

Устанавливает режим скрытия для компонента. Если режим скрыть был указан в этом режиме скрыть, можно переопределить ограничение компонента. Режим hide указывал, как диспетчер компоновки должен обрабатывать компонент, который не отображается. Режимы:

0 - Значение по умолчанию. Означает, что невидимые компоненты будут обрабатываться точно так, как если бы они были видны.
1 - размер компонента (если он невидим) будет установлен в 0, 0.
2 - Размер компонента (если он невидим) будет установлен в 0, 0, и пробелы также будут установлены на 0 вокруг него.
3 - Невидимые компоненты вообще не будут участвовать в макете, и это, например, не займет ячейку сетки.
Пример: "hidemode 1"

Ответ 1

Режим применяется, когда компонент проверен, как показано в этом пример. Метод JFrame initGUI() вызывает pack(), который вызывает validate() для выполнения начальной компоновки. Позже hideButton ActionListener вызывает validate(), который пересчитывает макет контейнера, чтобы отобразить новые параметры видимости. См. Также Как работает управление макетами.

Ответ 2

MigLayout hidemode полезен, когда у вас разные представления, но только для отображения активного. По умолчанию каждое представление будет занимать место в макете, даже если оно не видно.

Пример:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

import net.miginfocom.swing.MigLayout;

@SuppressWarnings("serial")
public class MigHidemode extends JPanel {

    private class RadioActionListener implements ActionListener {
        public void actionPerformed(final ActionEvent e) {
            final boolean showA = aRadio.isSelected();
            field.setVisible(showA);
            combo.setVisible(!showA);
        }
    }

    public static void main(final String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

                    final JDialog dialog = new JDialog();

                    final Container contentPane = dialog.getContentPane();
                    contentPane.setLayout(new BorderLayout());
                    contentPane.add(new MigHidemode(), BorderLayout.CENTER);

                    dialog.addWindowListener(new WindowAdapter() {
                        @Override
                        public void windowClosed(final WindowEvent e) {
                            System.exit(0);
                        }
                    });
                    dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
                    dialog.pack();
                    dialog.setLocationRelativeTo(null);
                    dialog.setVisible(true);
                } catch (final Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private final JTextField field;
    private final JRadioButton aRadio;
    private final JRadioButton bRadio;

    private final JComboBox<String> combo;

    public MigHidemode() {
        setLayout(new MigLayout("", "[]", "[][]"));

        final RadioActionListener radioListener = new RadioActionListener();

        aRadio = new JRadioButton("A");
        aRadio.addActionListener(radioListener);
        add(aRadio, "flowx,cell 0 0");

        bRadio = new JRadioButton("B");
        bRadio.addActionListener(radioListener);
        add(bRadio, "cell 0 0");

        field = new JTextField();
        add(field, "cell 0 1,hidemode 3");
        field.setColumns(20);

        combo = new JComboBox<String>();
        combo.setModel(new DefaultComboBoxModel<String>(new String[] {
            "hello",
            "world" }));
        add(combo, "cell 0 1,hidemode 3");

        final ButtonGroup bg = new ButtonGroup();
        bg.add(aRadio);
        bg.add(bRadio);
        aRadio.doClick();
    }
}