【问题标题】:Enable/Disable Multiple JComboBox Dynamically On NetBeans在 NetBeans 上动态启用/禁用多个 JComboBox
【发布时间】:2018-01-20 14:14:37
【问题描述】:

如何通过用户输入动态设置启用/禁用这么多JCombobox?

我有多个 JComboBox 这样的简单设计:

class foo{
    private javax.swing.JButton jButton1;
    private javax.swing.JComboBox<String> jComboBox1;
    private javax.swing.JComboBox<String> jComboBox2;
    private javax.swing.JComboBox<String> jComboBox3;
    private javax.swing.JComboBox<String> jComboBox4;
    private javax.swing.JComboBox<String> jComboBox5;
    private javax.swing.JComboBox<String> jComboBox6;
    private javax.swing.JComboBox<String> jComboBox7;
    private javax.swing.JComboBox<String> jComboBox8;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JTextField jTextField1;

    foo(){
        jPanel1 = new javax.swing.JPanel();
        jComboBox1 = new javax.swing.JComboBox<>();
        jComboBox2 = new javax.swing.JComboBox<>();
        jComboBox4 = new javax.swing.JComboBox<>();
        jComboBox3 = new javax.swing.JComboBox<>();
        jComboBox5 = new javax.swing.JComboBox<>();
        jComboBox6 = new javax.swing.JComboBox<>();
        jComboBox7 = new javax.swing.JComboBox<>();
        jComboBox8 = new javax.swing.JComboBox<>();
        jPanel2 = new javax.swing.JPanel();
        jTextField1 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation( javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setLayout(new java.awt.GridLayout(8, 0));

        jComboBox1.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jPanel1.add(jComboBox1);

        jComboBox2.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 5", "Item 6", "Item 7", "Item 8" }));
        jPanel1.add(jComboBox2);

        jComboBox4.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 9", "Item 10", "Item 11", "Item 12" }));
        jPanel1.add(jComboBox4);

        jComboBox3.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 13", "Item 14", "Item 15", "Item 16" }));
        jPanel1.add(jComboBox3);

        jComboBox5.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 17", "Item 18", "Item 19", "Item 20" }));
        jPanel1.add(jComboBox5);

        jComboBox6.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 21", "Item 22", "Item 23", "Item 24" }));
        jPanel1.add(jComboBox6);

        jComboBox7.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 25", "Item 26", "Item 27", "Item 28" }));
        jPanel1.add(jComboBox7);

        jComboBox8.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 29", "Item 30", "Item 31", "Item 32" }));
        jPanel1.add(jComboBox8);

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        jPanel2.setLayout(new java.awt.BorderLayout());
        jPanel2.add(jTextField1, java.awt.BorderLayout.CENTER);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                // whats todo
            }
        });
        jPanel2.add(jButton1, java.awt.BorderLayout.LINE_END);

        getContentPane().add(jPanel2, java.awt.BorderLayout.PAGE_END);

        pack();
    }
}

那么,如果用户类型 4,combo1combo4 将是 enabled,另一个将是 disabled,如何在 Button 侦听器上实现它?

【问题讨论】:

    标签: java swing netbeans dynamic jcombobox


    【解决方案1】:

    我有多个这样的组合框:

    JComboBox combo1 = new JComboBox();
    JComboBox combo2 = new JComboBox();
    JComboBox combo3 = new JComboBox();
    JComboBox combo4 = new JComboBox();
    JComboBox combo5 = new JComboBox();
    JComboBox combo6 = new JComboBox();
    JComboBox combo7 = new JComboBox();
    JComboBox combo8 = new JComboBox();
    

    每当我看到名为 foo1, foo2, foo3, ... 的变量时,我都会想,到底为什么编码器在这里不使用数组或 ArrayList?我问你同样的问题——你为什么要让自己的事情变得不必要地困难?

    如果你创建了一个 JComboBoxes 的 ArrayList--

    List<JComboBox<String>> combos = new ArrayList<>();
    // code goes here to add 8 JComboBoxes to the list
    

    然后,如果您的用户选择了选项 4 并将其放入变量索引中,您可以通过以下方式轻松禁用除第 4 个 JComboBox 之外的所有内容:

    // first disable all the combos
    for (JComboBox<String> comboBox : combos) {
        comboBox.setEnabled(false);
    }
    combos.get(index - 1).setEnabled(true);  // enable the selected combo
    

    我使用index - 1,因为列表和数组是基于 0 的,而 ArrayList 中的第 4 个 JComboBox 位于索引 3。

    但其他问题比比皆是:JTextField 几乎不应该添加 KeyListener,因为这会破坏它们的基本功能。考虑将 DocumentListener 添加到其 Document 或 DocumentFilter 甚至更好,使用 JSlider 或 JSpinner 以允许您将组件限制为仅允许可接受的输入?然后使用 ChangeListener。但更重要的是,你的设计很糟糕。为什么不简单地拥有一个 JComboBox 并在适当的事件发生时交换其数据模型?

    如果您使用了一个填充了整数的 JSpinner,您可以向它添加一个更改侦听器,该侦听器将为单个 JComboBox 选择适当的数据模型,您的代码会更简单,对用户来说更白痴,最重要的是,更容易进行调试和增强。

    例如

    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.*;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    public class Foo2 extends JPanel {
        private static final int MIN_VALUE = 1;
        private static final int MAX_VALUE = 8;
    
        private JSpinner spinner = new JSpinner(new SpinnerNumberModel(MIN_VALUE, MIN_VALUE, MAX_VALUE, 1));
        private List<DefaultComboBoxModel<String>> models = new ArrayList<>();
        private JComboBox<String> comboBox = new JComboBox<>();
    
        public Foo2() {
            for (int i = MIN_VALUE; i <= MAX_VALUE; i++) {
                DefaultComboBoxModel<String> comboModel = new DefaultComboBoxModel<>();
                for (int j = 0; j < 5; j++) {
                    String element = String.format("Selection: %d, Item: %d", i, j);
                    comboModel.addElement(element);
                }
                models.add(comboModel);
            }
            comboBox.setModel(models.get(0));
    
            spinner.addChangeListener(new ChangeListener() {
    
                @Override
                public void stateChanged(ChangeEvent e) {
                    int selection = (int) spinner.getValue();
                    comboBox.setModel(models.get(selection - 1));
                }
            });
    
            add(new JLabel("Selection:"));
            add(spinner);
    
            add(new JLabel("Combo:"));
            add(comboBox);
        }
    
        private static void createAndShowGui() {
            Foo2 mainPanel = new Foo2();
    
            JFrame frame = new JFrame("Foo2");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(mainPanel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> createAndShowGui());
        }
    }
    

    【讨论】:

    • 我现在正在使用NetBeans,所以我看到的netbeans不能使用数组组件,对吧?
    • @newbie:不,不对,根本不对。您可以创建用 net beans 创建的组件填充的数组或数组列表。这就是 Java——你可以做任何事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    相关资源
    最近更新 更多