ジャバ:MiGレイアウト:「隠れモード」の使い方は?
-
19-09-2019 - |
質問
使い始めています MiGレイアウト 私の GUI デザインでは、必要な機能の 1 つは、他のコンポーネントの状態に基づいて特定のコンポーネントを表示/非表示にすることです。
これを自分でコード化しようとしていたところ、次のいずれかに気づきました。 コンポーネントの制約 MiGLayout でサポートされているのは hidemode
.
これは私が思っていることをやりますか?その場合、次のように仮定して、非表示/再表示アクションをトリガーするにはどうすればよいですか? hidemode
設定されています?(ドキュメントを調べた後、設定方法を見つけることができました) hidemode
, ただし、その後の使用方法は異なります)
hidemode
コンポーネントの非表示モードを設定します。非表示モードが で指定されている場合、この非表示モードはコンポーネント制約によってオーバーライドできます。非表示モードは、レイアウト マネージャーが表示されていないコンポーネントをどのように処理するかを指定します。モードは次のとおりです。
0 - デフォルト。非表示のコンポーネントが、表示されているかのように正確に処理されることを意味します。
1 - コンポーネントのサイズ (非表示の場合) は 0, 0 に設定されます。
2 - コンポーネントのサイズ (非表示の場合) は 0, 0 に設定され、その周囲のギャップも 0 に設定されます。
3 - 非表示のコンポーネントはレイアウトにまったく関与せず、たとえばグリッド セルを占有しません。
例:「ハイドモード1」
解決
このモードは、コンポーネントが次の場合に適用されます。 検証済み, 、これに見られるように 例. 。の JFrame
さんの initGUI()
メソッド呼び出し pack()
, を呼び出す validate()
初期レイアウトを行います。その後、 HideButton の 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();
}
}