使用多个JComboBox;但他们都得到任何行动事件

时间:2015-06-10 16:38:15

标签: java swing combobox

我确定我在这里做了一些非常愚蠢的事情;但它已经困扰了我几个小时。 我使用NetBeans 8.something,如果有帮助的话。 我有一个包含多个组合框的表单,可以从数据集中进行选择。第一个选择年份,然后这个选项填充monthCombo,填充dayCombo的选择,等等。

自动生成的代码在这里:

    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,因为这是鼠标左键单击的事件修饰符。

问题在于,如果我选择例如yearCombo中的项目,则会调用所有三个ActionListener。

这是单击年份项目2015时log()的输出。

年度组合项目2015

月组合项2015源javax.swing.JComboBox [,77,6,37x25,无效,layout = javax.swing.plaf.basic.BasicComboBoxUI $ Handler,alignmentX = 0.0,alignmentY = 0.0,border = javax.swing .plaf.synth.SynthBorder @ 1b2a5dc,旗帜= 320,MAXIMUMSIZE =,=的minimumSize,首选大小=,isEditable =假,lightWeightPopupEnabled =真,maximumRowCount = 8,selectedItemReminder = 2015]

日组合项目2015源javax.swing.JComboBox [,120,6,37x25,无效,布局= javax.swing.plaf.basic.BasicComboBoxUI $ Handler,alignmentX = 0.0,alignmentY = 0.0,border = javax.swing .plaf.synth.SynthBorder @ f77fca,旗帜= 320,MAXIMUMSIZE =,=的minimumSize,首选大小=,isEditable =假,lightWeightPopupEnabled =真,maximumRowCount = 8,selectedItemReminder = 2015]

我知道我可以得到这个事件的来源,但是这并没有帮助 没有明显的方法可以区分它们。

我无法相信这是为了这样工作,所以我做错了什么?

1 个答案:

答案 0 :(得分:4)

在年份组合中选择时,您将填写月份组合,以便触发事件。因此选择已更改,因此dayCombo将填充此事件。

有两种方法:

  1. 定义一个标志isAPI。默认情况下,它是错误的。如果您的逻辑更新组合将其设置为true,则在项目更新后返回t false。所有的监听器都检查标志,它是真的(API调用)什么都不做。

  2. 在更新模型之前从combox中删除侦听器,并在填充模型后读取