Java:MiGLayout:如何使用“hidemode”?

2022-09-04 04:04:48

我开始使用MiGLayout进行GUI设计,我需要的功能之一是根据其他组件的状态显示/隐藏某些组件。

我打算自己编写代码,当我注意到MiGLayout支持的组件约束之一是。hidemode

这能做我认为它做的事情吗?如果是这样,如何触发隐藏/取消隐藏操作(假设已设置)?(在浏览了文档之后,我能够找到如何设置,但不是之后如何使用它)hidemodehidemode


hidemode

设置组件的隐藏模式。此隐藏模式可以被组件约束覆盖。隐藏模式指定布局管理器应如何处理不可见的组件。这些模式包括:

0 - 默认值。意味着不可见的组件将完全按照可见的方式进行处理。
1 - 组件的大小(如果不可见)将设置为 0, 0。
2 - 组件的大小(如果不可见)将设置为 0, 0,并且其周围的间隙也将设置为 0。
3 - 不可见组件根本不参与布局,例如,它不会占用网格单元。
示例:“隐藏模式 1”


答案 1

该模式在验证组件时适用,如本示例所示。的方法调用 ,它调用来做初始布局。稍后,hideButton 的调用 ,它重新计算容器的布局以反映新的可见性设置。另请参阅布局管理的工作原理JFrameinitGUI()pack()validate()ActionListenervalidate()


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

推荐