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