2

内のすべてのコンポーネントを再帰的に有効/無効にできるメソッドがありますJPanel。例外リストもあります。だから私は次のことができます

  • 誰を有効にするかpanel1を除いて、のすべてのコンポーネントを無効にします。textfield1, textfield3
  • panel2無効にする必要がある人を除いて、のすべてのコンポーネントを有効にしbutton2, label3ます。

これはまさにそれを行うSSCCEです:

import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.util.HashSet;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        final JPanel panel = new JPanel(new GridLayout(3, 3));

        final JTextField textfield = new JTextField("asdf");
        final JButton button = new JButton("asdf");
        final JCheckBox checkbox = new JCheckBox("asdf");
        final JSpinner spinner = new JSpinner(new SpinnerNumberModel(1, 1, 100, 1));
        final JLabel label = new JLabel("asdf");

        panel.add(textfield);
        panel.add(button);
        panel.add(checkbox);
        panel.add(spinner);
        panel.add(label);
        // fill in some random stuff
        for (int i = 0; i < 4; i++)
            panel.add(new JLabel("asdf"));

        frame.setContentPane(panel);
        frame.setSize(300, 100);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean toggle = true;
                while (true) {
                    toggle = !toggle;
                    Set<Component> enableList = new HashSet<Component>();
                    Set<Component> disableList = new HashSet<Component>();
                    enableList.add(textfield);
                    enableList.add(spinner);
                    disableList.add(checkbox);
                    setEnableAllRec(panel, toggle, disableList, enableList);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {}
                }
            }
        }).start();
        frame.setVisible(true);
    }

    public static void setEnableAllRec(Container root, boolean defaultState, Set<Component> disableList, Set<Component> enableList) {
        if (root == null) return;
        for (Component c : root.getComponents()) {
            if (disableList != null && disableList.contains(c)) {
                c.setEnabled(false);
                disableList.remove(c);
            } else if (enableList != null && enableList.contains(c)) {
                c.setEnabled(true);
                enableList.remove(c);
            } else c.setEnabled(defaultState);
            if (c instanceof Container) setEnableAllRec((Container) c, defaultState, disableList, enableList);
        }
    }
}

SSCCEは、すべてのコンポーネントを毎秒設定して、交互に有効/無効にします。常に有効にする必要がある一部のコンポーネントと、常に無効にする必要がある一部のコンポーネントを除きます。これは、を除いて非常にうまく機能しJSpinnerます。コンポーネントとして検出されますが、リストに見つかりません(したがって、特別な場合としては処理されません)。私が試した他のすべてのスイングコンポーネントは、期待どおりに機能しています。

何が悪いのか教えてもらえますJSpinnerか?

SSCCEがあまり混乱しないことを願っています...;)

4

1 に答える 1

3

JSpinnerに2つのボタンやエディター(のコードを参照javax.swing.plaf.basic.BasicSpinnerUI)などの他のコンポーネントが含まれていて、すべてのコンテナー、つまり、の含まれているコンポーネントを再帰的に実行するからJSpinnerです。

ところで、あなたのスレッドはSwing-EDTに違反しています。あなたはむしろそれをSwing Timer

解決策は簡単です:

import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.util.HashSet;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        final JPanel panel = new JPanel(new GridLayout(3, 3));

        final JTextField textfield = new JTextField("asdf");
        final JButton button = new JButton("asdf");
        final JCheckBox checkbox = new JCheckBox("asdf");
        final JSpinner spinner = new JSpinner(new SpinnerNumberModel(1, 1, 100, 1));
        final JLabel label = new JLabel("asdf");

        panel.add(textfield);
        panel.add(button);
        panel.add(checkbox);
        panel.add(spinner);
        panel.add(label);
        // fill in some random stuff
        for (int i = 0; i < 4; i++) {
            panel.add(new JLabel("asdf"));
        }

        frame.setContentPane(panel);
        frame.setSize(300, 100);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean toggle = true;
                while (true) {
                    toggle = !toggle;
                    Set<Component> enableList = new HashSet<Component>();
                    Set<Component> disableList = new HashSet<Component>();
                    enableList.add(textfield);
                    enableList.add(spinner);
                    disableList.add(checkbox);
                    setEnableAllRec(panel, toggle, disableList, enableList);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    }
                }
            }
        }).start();
        frame.setVisible(true);
    }

    public static void setEnableAllRec(Container root, boolean defaultState, Set<Component> disableList, Set<Component> enableList) {
        if (root == null) {
            return;
        }
        for (Component c : root.getComponents()) {
            if (disableList != null && disableList.contains(c)) {
                c.setEnabled(false);
                disableList.remove(c);
            } else if (enableList != null && enableList.contains(c)) {
                c.setEnabled(true);
                enableList.remove(c);
            } else {
                c.setEnabled(defaultState);
                if (c instanceof Container) {
                    setEnableAllRec((Container) c, defaultState, disableList, enableList);
                }
            }
        }
    }
}
于 2012-12-12T15:59:23.487 に答える