2017-08-12 53 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 - 你可以做任何事情。 –