2015-06-10 2 views
0

Я уверен, что я делаю что-то действительно глупо здесь; но это меня било часами. Я использую NetBeans 8.что-то, если это помогает. У меня есть форма с несколькими полями со списком, чтобы выбрать из набора данных. Первый выбирает год, этот выбор затем заполняет monthCombo, выбор из которого заполняет dayCombo и т. Д.Использование нескольких JComboBoxes; но все они получают какие-либо действия.

Автоматически сгенерированный код здесь:

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
    jPanel1.setLayout(jPanel1Layout); 
    jPanel1Layout.setHorizontalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 1323, Short.MAX_VALUE) 
     .addGroup(jPanel1Layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(yearCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(monthCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(dayCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
    ); 

Я дал им каждый другой ActionListener, например, так:

yearCombo.addActionListener(yearListener); 
    monthCombo.addActionListener(monthListener); 
    dayCombo.addActionListener(dayListener); 

Где слушатели определяются следующим образом:

// ------------------------------------------------------- 
private ActionListener dayListener=new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent e) { 

     if(e.getModifiers()==CLICKED){ 
      log("Day combo item "+dayCombo.getSelectedItem().toString()+" source "+e.getSource().toString()); 
      rDataSelector.set(RDataSelector.SELECT_DAY,Integer.parseInt(dayCombo.getSelectedItem().toString())); 
      rDataSelector.fillCombo(courseCombo); 
     } 
    } 
}; 
// --------------------------------------------------------------- 
private ActionListener monthListener=new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(e.getModifiers()==CLICKED){ 
      log("Month combo item "+monthCombo.getSelectedItem().toString()+" source "+e.getSource().toString()); 
      rDataSelector.set(RDataSelector.SELECT_MONTH,Integer.parseInt(monthCombo.getSelectedItem().toString())); 
      rDataSelector.fillCombo(dayCombo); 
     } 
    } 
}; 
// ----------------------------------------------------------------- 
private ActionListener yearListener=new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(e.getModifiers()==CLICKED){ 
      log("Year combo item "+yearCombo.getSelectedItem().toString()); 
      rDataSelector.set(RDataSelector.SELECT_YEAR,Integer.parseInt(yearCombo.getSelectedItem().toString())); 
      rDataSelector.fillCombo(monthCombo); 
     } 
    } 
}; 

FWIW, CLICKED определяется как 16, так как это модификатор события для левой мыши c облизывать.

Проблема в том, что если я выберем, например, элемент из yearCombo, вызывается все три ActionListeners.

Это результат журнала() при щелчке по объекту года 2015 года.

Год комбинированный элемент 2015

месяц комбинированный элемент 2015 Источник javax.swing.JComboBox [, 77,6,37x25, недействителен, расположение = javax.swing.plaf.basic.BasicComboBoxUI $ Хэндлер, alignmentX = 0,0, alignmentY = 0.0, border = javax.swing.plaf.synth.SynthBorder @ 1b2a5dc, flags = 320, maximumSize =, minimumSize =, preferredSize =, isEditable = false, lightWeightPopupEnabled = true, maximumRowCount = 8, selectedItemReminder = 2015]

Day combo item 2015 source javax.swing.JComboBox [, 120,6,37x25, недействительный, layout = javax.swing.plaf.basic.BasicComboBoxUI $ Обработчик, alignmentX = 0.0, alignmentY = 0.0, border = javax.swing.plaf .synth.SynthBorder @ f77fca, флаги = 320, MaximumSize =, = MinimumSize, PreferredSize =, IsEditable = F Alse, lightWeightPopupEnabled = верно, maximumRowCount = 8, selectedItemReminder = 2015]

Я знаю, что я могу получить источник события, но это не помогает, так как нет никакого очевидного способа отличить друг от друга.

Я не могу поверить, что это должно работать так, так что я делаю неправильно?

+0

Есть ли шанс, что вы также добавили обработчик событий через графический интерфейс? –

ответ

4

При выборе в комбинированном году вы заполняете комбо месяц, чтобы событие было запущено. Соответственно, выбор изменился, так что dayCombo заселен, запустив событие.

Есть 2 approachs:

  1. определить Isapi флаг. По умолчанию оно ложно. Если ваша логическая версия обновляет комбо, установите значение true nd back t false после обновления элементов. Все слушатели проверяют флаг, и это правда (вызов API) просто ничего не делают.

  2. Удалить го слушателей из Combox перед обновлением своих моделей и readd после того, как модель заполняются

+0

Я не понимал, что все поля со списком были связаны друг с другом, хорошая работа. – River

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