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"

È stato utile?

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();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top