Java: MiGLayout: как использовать `hidemode`? - PullRequest
13 голосов
/ 08 января 2010

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

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

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


hidemode

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

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

Ответы [ 2 ]

7 голосов
/ 08 января 2010

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

2 голосов
/ 20 июля 2012

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();
    }
}
...