Java: MiGLayout: Come usare `hidemode`?
-
19-09-2019 - |
Domanda
Sto iniziando utilizzando MiGLayout per il mio disegno GUI, e una delle funzionalità avrei bisogno è quello di mostrare / nascondere alcune componenti in base allo stato di altri componenti.
Stavo per codificare questo me stesso, quando ho notato che uno dei vincoli Component supportata da MiGLayout è hidemode
.
Questo fare ciò che penso che fa? Se è così, come faccio a innescare un nascondere / azione unhide, assumendo il hidemode
è stato impostato? (Dopo aver guardato attraverso la documentazione sono riuscito a trovare il modo di impostare il hidemode
, ma non come viene utilizzato in seguito)
hidemode
Imposta la modalità di pellame per il componente. Se la modalità di pelle è stato specificato nel modo di nascondere Questo può essere ignorato dal vincolo componente. La modalità di nascondere specificato come il gestore di layout dovrebbe gestire un componente che non è visibile. Le modalità sono:
0 - Default. Significa che i componenti invisibili saranno trattati esattamente come se fossero visibili.
1 - La dimensione del componente (se invisibile) verrà impostato su 0, 0.
2 - Le dimensioni del componente (se invisibile) verrà impostato su 0, 0 e le lacune saranno anche essere impostato a 0 intorno ad esso
.
3 - componenti invisibili non parteciperanno nel layout a tutti e sarà, per esempio, non prendere una cella della griglia
.
Esempio: "hidemode 1"
Soluzione
Il modo applica quando il componente è convalidato , come si vede in questo esempio . Metodo JFrame
del initGUI()
chiama pack()
, che invoca validate()
per fare il layout iniziale. Più tardi, il hideButton chiamate ActionListener
validate()
, che ricalcola il layout del contenitore per riflettere le nuove impostazioni di visibilità. Vedi anche, Come layout Direzione Lavori .
Altri suggerimenti
hidemode
di MigLayout è utile quando si hanno diversi punti di vista, ma solo vuole visualizzare quella attiva. Per default, ogni vista occupa spazio nel layout, anche se non è visibile.
Esempio:
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();
}
}