Я уверен, что я делаю что-то действительно глупо здесь; но это меня било часами. Я использую 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]
Я знаю, что я могу получить источник события, но это не помогает, так как нет никакого очевидного способа отличить друг от друга.
Я не могу поверить, что это должно работать так, так что я делаю неправильно?
Есть ли шанс, что вы также добавили обработчик событий через графический интерфейс? –