2017-08-12 7 views
-1

Comment activer/désactiver autant de JCombobox dynamiquement par l'utilisateur?Activer/désactiver dynamiquement plusieurs JComboBox sur NetBeans

je un design simple avec plusieurs JComboBox comme ceci:

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(); 
    } 
} 

donc, Comment mettre en œuvre sur Button auditeur si le type d'utilisateur 4, combo1-combo4 sera enabled, l'autre disabled?

Répondre

2

J'ai plusieurs combobox comme ceci:

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(); 

Chaque fois que je vois des variables nommées foo1, foo2, foo3, ... Je pense à moi-même, pourquoi diable est le codeur de ne pas utiliser un array ou ArrayList ici? Je vous demande la même chose - pourquoi faites-vous des choses inutilement plus difficiles pour vous?

Si vous avez créé un ArrayList de JComboBoxes--

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

Ensuite, si votre utilisateur a sélectionné le choix 4 et le mettre dans une variable, index, vous pouvez facilement désactiver tous les 4ème JComboBox via:

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

J'utilise index - 1 depuis les listes et les tableaux sont basés 0 et 4 JComboBox dans le ArrayList est à l'index 3.

Mais d'autres questions abo und: JTextFields ne devrait presque jamais avoir de KeyListeners, car cela peut corrompre leur fonctionnement de base. Envisagez-vous d'ajouter un DocumentListener à son Document ou à un DocumentFilter ou mieux, en utilisant un JSlider ou un JSpinner pour vous permettre de contraindre le composant à ne permettre qu'une entrée acceptable? Ensuite, utilisez un ChangeListener. Mais d'une importance encore plus grande, le vôtre est un design terrible. Pourquoi ne pas simplement avoir un seul JComboBox et échanger son modèle de données lorsque l'événement approprié se produit? Si vous utilisiez un JSpinner rempli d'ints, vous pourriez lui ajouter un écouteur de modification qui sélectionnerait le modèle de données approprié pour un seul JComboBox et votre code serait plus simple, plus idiot pour l'utilisateur, et surtout, plus facile à déboguer et à améliorer.

Par exemple

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

J'utilise NetBeans en ce moment, donc ce que je vois NetBeans ne peuvent pas utiliser le composant de tableau, à droite? – newbie

+0

@newbie: non pas juste, pas du tout. Vous pouvez créer des tableaux ou des listes de tableaux remplis avec les composants créés par les beans nets. C'est Java - vous pouvez faire n'importe quoi. –