سؤال

أنا بدأت باستخدام miglayout. بالنسبة لتصميم واجهة المستخدم الرسومية، وواحد من الميزة التي أحتاج إليها هو إظهار / إخفاء مكونات معينة بناء على حالة المكونات الأخرى.

كنت ذاهبا لرمز هذا بنفسي، عندما لاحظت أن أحد قيود المكون بدعم من Miglayout هو hidemode.

هل هذا يفعل ما أعتقد أنه يفعل؟ إذا كان الأمر كذلك، كيف يمكنني تشغيل إجراء إخفاء / إخفاء، بافتراض hidemode وقد تم تعيين؟ (بعد النظر من خلال الوثائق كنت قادرا على معرفة كيفية ضبط hidemode, ، ولكن ليس كيف يتم استخدامه بعد ذلك)


hidemode

يضبط وضع إخفاء للمكون. إذا تم تحديد وضع إخفاء في وضع إخفاء هذا، فيمكن تجاوز وضع المكون. حدد وضع إخفاء كيفية التعامل مع مدير التخطيط مع مكون غير مرئي. الأوضاع هي:

0 - الافتراضي. يعني أن المكونات غير المرئية سيتم التعامل معها تماما كما لو كانت مرئية.
1 - سيتم تعيين حجم المكون (إذا كان غير مرئي) على 0، 0.
2 - سيتم تعيين حجم المكون (إذا كان غير مرئي) على 0 و 0 وسيتم تعيين الثغرات أيضا على 0 حولها.
3 - لن تشارك مكونات غير مرئية في التصميم على الإطلاق، وسوف تتناول مثلا خلية الشبكة.
مثال: "HIDEMODE 1"

هل كانت مفيدة؟

المحلول

ينطبق الوضع عندما يكون المكون التحقق من صحة, ، كما رأينا في هذا مثال. وبعد ال JFrameinitGUI() طريقة المكالمات 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();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top