gpt4 book ai didi

java - JSpinner 与其他 Swing 组件有何不同?

转载 作者:行者123 更新时间:2023-12-04 05:19:17 36 4
gpt4 key购买 nike

我有一个方法可以递归地启用/禁用 JPanel 中的所有组件.还有异常(exception)列表。所以我可以做到以下几点

  • 禁用 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 不会太困惑......;)

    最佳答案

    仅仅因为 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);
    }
    }
    }
    }
    }

    关于java - JSpinner 与其他 Swing 组件有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13843189/

    36 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com