2013-03-24 2 views
0

Я не группировал свои jradiobuttons, чтобы пользователи могли выбирать несколько вариантов, и я могу хранить их в массиве узлов ... но он только читает один раз. Что не так с кодом? Пожалуйста, просветить меняПочему мой jradiobutton принимает только один раз?

private String[] showGUIForNodeDeletion() { 

     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(map.size(), 1)); 
     ButtonGroup btnGrp = new ButtonGroup(); 
     final String nodes[] = new String[10]; 
     Set<String> keySet = map.keySet(); 

     for (String name : keySet) { 

      btnRadio = new JRadioButton(name); 
      btnRadio.setActionCommand(map.get(name).x + "," + map.get(name).y + "," + name); 
         //btnGrp.add(btnRadio); 
      panel.add(btnRadio); 
     } 

     btnRadio.addActionListener(new ActionListener() { 
      int x = 0; 

      public void actionPerformed(ActionEvent e) { 

       nodes[x] = ((JRadioButton) e.getSource()).getActionCommand(); 
       System.out.println("Node counting " + x); 
       x++; 
      } 
     }); 

     if (keySet.isEmpty()) { 
      JOptionPane.showMessageDialog(AnotherGuiSample.this, "Work Space is empty", "Error", JOptionPane.ERROR_MESSAGE); 
     } else { 
      JOptionPane.showMessageDialog(AnotherGuiSample.this, panel, "Select node to remove", JOptionPane.INFORMATION_MESSAGE); 
     } 
     for(int x = 0; x < nodes.length; x++) 
     System.out.println("node is " + nodes[x]); 

     return nodes; 
    } 
+0

Если ваша цель - разрешить пользователю выбирать несколько элементов, используйте JCheckBox, а не JRadioButton. Визуальные сигналы важны. Большинство людей полагают, что можно выбрать только одну радиокнопку. Вы не хотите, чтобы пользователи угадывали, как что-то работает, так же, как вы не ставили бы кнопку-бар на дверь, которая открывается внутрь. – VGR

ответ

2

ваш для кода цикл должен быть таким:

UPDATE

Set<String> rbSet = new TreeSet<String>(); 
for (String name : keySet) { 

    btnRadio = new JRadioButton(name); 
    btnRadio.setActionCommand(map.get(name).x + "," + map.get(name).y + "," + name); 
    btnRadio.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent evt) 
     { 
      JRadioButton obj = (JRadioButton)evt.getSource(); 
      if (obj.isSelected()) 
      { 
       rbSet.add(obj.getActionCommand()); 
      } 
      else 
      { 
       rbSet.remove(obj.getActionCommand()); 
      } 
     } 
    }); 
    panel.add(btnRadio); 
} 
int counter = 0 ; 
for (String action : rbSet) 
{ 
    nodes[counter++] = action; 
} 

Что происходит, что вы регистрировал ActionListener с последним объектом, созданным в для цикла, поскольку вы сделали это после цикла for. Вот почему он стрелял только для объекта lat JRaioButton, созданного и добавленного к JPanel. У вас должен быть регистр ActionListener in for loop с каждым JRadioButton, созданным в цикле. Это заставляет ActionEvent стрелять за каждые JRadioButton, которые вы добавляете к JPanel.

+0

Спасибо за помощь, но она по-прежнему такая же. Он хранит только первый выбор, который я делаю. – user2064467

+0

@ user2064467 Смотрите мое обновление. –

Смежные вопросы