2017-04-20 6 views
0

J'ai 9 (sélection par défaut) options sélectionnables (tout de même pour le 20) pour mes JComboBox.
Les 20 font partie de la baie 2 JComboBox. (10-10 pour chaque). Je veux les limiter comme ceci:
S'il y a 4 sélectionné l'option de (par exemple) 4 et l'utilisateur sélectionne une 5ème
l'une, l'un d'eux saute à défaut de garder la limite de 4.Comment puis-je limiter le nombre de sélections maximum pour 1 option de sélection de 20 JCombobox? javafor ex

Comment puis-je le faire?
Ex:

for (int i = 0; i < roles1.length; i++) { 
      roles1[i] = new JComboBox(); 
      roles1[i].setModel(new DefaultComboBoxModel(new String[] { "Not Selected", "PartnerInCrime", "Driver", 
        "Gunman", "Coordinator", "Hacker", "Distraction", "GadgetGuy", "Bruglar", "ConMan" })); 
      roles1[i].setBounds(boxPlace, 200, 100, 20); 
      boxPlace += 105; 
      getFrame().getContentPane().add(roles1[i]); 

     } 
+0

voulez-vous s'il vous plaît ajouter quelques codes? – Yahya

+0

Fait, comme vous avez souhaité :) – Viktor

Répondre

2

Voici une suggestion qui est censé vous conduire dans la bonne direction. Tout d'abord, vous devez ajouter un ActionListener à chaque ComboBox, qui appelle une méthode qui compare toutes les sélections avec votre sélection actuelle.

roles1[i].addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 

     // get the current selection 
     JComboBox currentBox = (JComboBox)e.getSource(); 
     String currentSelection = (String)currentBox.getSelectedItem(); 

     // call the method and hand in your current selection 
     checkForSelectionExceeding(currentSelection);    

    } 
}); 

Dans votre méthode de balayage, vous devez mémoriser la quantité de matches lors de la numérisation. Si votre limite est dépassée, réinitialisez la case actuelle à la valeur par défaut et arrêtez la numérisation. Quelque chose comme ceci:

private void checkForSelectionExceeding(String currentSelection){ 
    int matches = 0; 

    for(int i=0; i<roles1.length; i++) { 
     if(roles1[i].getSelectedItem().equals(currentSelection)) { 
     matches++; 
     } 

     if(matches > 4) { 
     roles1[i].setSelectedItem("Not Selected"); 
     break; 
     } 
    } 
} 

Il vous suffit de factoriser cette solution un peu pour analyser les deux tableaux de façon séquentielle.

Espérons que cela aide.

+0

Merci, ça a beaucoup aidé! – Viktor

+0

Dans ce cas, chaque fois que l'utilisateur sélectionne une zone de liste déroulante, il doit faire une boucle sur l'ensemble du tableau et rechercher chaque valeur sélectionnée. – Yahya

+1

Chez John: Je dirais que les deux approches ont leurs avantages et leurs inconvénients. Ma solution a peut-être besoin de quelques millisecondes de plus en raison de la boucle nécessaire. Votre suggestion nécessite une carte supplémentaire pour contenir les informations référencées. Mais dans le cas de seulement 20 ComboBox, aucune de ces con n'est vraiment une question. - @Victor: J'apprécierais vraiment si vous pouviez marquer ou upvote la solution qui vous a aidé. Merci d'avance. :) – DiabolicWords

1

Si je comprends bien votre question, j'ai une idée que vous pouvez commencer à partir de:

// create global HashMap that can records the occurrence of the selection of each item 
Map<String, Integer> reference = new HashMap<String, Integer>(); 
// populate it 
reference.put("PartnerInCrime", 0); 
reference.put("Driver", 0); 
reference.put("Gunman", 0); 
reference.put("Coordinator", 0); 
reference.put("Hacker", 0); 
reference.put("Distraction", 0); 
reference.put("GadgetGuy", 0); 
reference.put("Bruglar", 0); 
reference.put("ConMan", 0); 

// then for every JComboBox in your array -> add action item listener to observe and control the selection like this 


for(JComboBox<String> jcb : roles1){ 
    jcb.addItemListener(new ItemListener(){ 
     public void itemStateChanged(ItemEvent ie){ 
     if(ie.getStateChange() == ItemEvent.DESELECTED){ // decrement record 
      if(!ie.getItem().toString().equals("Not Selected")){ 
      reference.put(ie.getItem().toString(), reference.get(ie.getItem().toString()) -1); 
      } 
     } 
     else if(ie.getStateChange() == ItemEvent.SELECTED){ 
      if(!ie.getItem().toString().equals("Not Selected")){ 
      if(reference.get(ie.getItem().toString())>=4){ // if already selected 4 of them 
       jcb.setSelectedIndex(0); // return to the default 
       } 
       else{ // else record the selection 
        reference.put(ie.getItem().toString(), reference.get(ie.getItem().toString()) +1); 
       }  
      } 
     } 
     } 
    }); 
}