2017-08-12 57 views
-1

如何通过用户输入动态设置启用/禁用多个JCombobox?在NetBeans上动态启用/禁用多个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(); 
    } 
} 

因此,如何实现它Button监听器,如果用户键入4,combo1combo4enabled,对方就会disabled

回答

2

我有多个组合框是这样的:

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在这里?我对你也这么问 - 你为什么要让事情变得不必要地更难?

如果你,如果你的用户选择的选择4,放入一个变量来创建JComboBoxes--

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

随后的ArrayList,指数,你可以很容易地通过禁用所有,但第四的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和4的JComboBox ArrayList中的索引为3

但其他问题ABO und:JTextFields应该几乎不会将KeyListeners添加到它们中,因为这可能会破坏它们的基本功能。考虑将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()); 
    } 
} 
+0

我使用NetBeans现在,让我看到了什么的NetBeans无法使用阵列组件,对不对? – newbie

+0

@newbie:不对,根本不对。您可以创建数组或数组列表,这些数组或列表中填充了由net bean创建的组件。这是Java - 你可以做任何事情。 –