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

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

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

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


hidemode

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

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

2 ответа

Решение

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

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();
    }
}
Другие вопросы по тегам