14

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

当我注意到MiGLayout 支持的组件约束hidemode之一是.

这和我想的一样吗?如果是这样,假设hidemode已设置,我如何触发隐藏/取消隐藏操作?(在查看文档后,我能够找到如何设置hidemode,但不知道之后如何使用它)


hidemode

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

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

4

2 回答 2

7

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

于 2010-01-08T12:44:51.750 回答
2

hidemode当您有不同的视图但只想显示活动视图时,MigLayout很有用。默认情况下,每个视图都会占用布局中的空间,即使它不可见。

例子:

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();
    }
}
于 2012-07-19T23:57:07.373 回答