Java 使用多个jcombox;但他们都有任何动作事件

Java 使用多个jcombox;但他们都有任何动作事件,java,swing,combobox,Java,Swing,Combobox,我确信我在这里做了一些非常愚蠢的事情;但它已经困扰我好几个小时了。 我用的是NetBeans 8.0之类的东西,如果有帮助的话。 我有一个带有多个组合框的表单,可以从数据集中进行选择。首先选择年份,然后填充monthCombo,从中填充dayCombo,依此类推 自动生成的代码如下所示: javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(j

我确信我在这里做了一些非常愚蠢的事情;但它已经困扰我好几个小时了。 我用的是NetBeans 8.0之类的东西,如果有帮助的话。 我有一个带有多个组合框的表单,可以从数据集中进行选择。首先选择年份,然后填充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 source javax.swing.JComboBox[,77,6,37x25,无效,layout=javax.swing.plaf.basic.basicmboboxUI$Handler,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth。SynthBorder@1b2a5dc,flags=320,maximumSize=,minimumSize=,preferredSize=,IsEdit=false,lightWeightPopupEnabled=true,maximumRowCount=8,SelectedItemRemembers=2015]

日期组合项2015 source javax.swing.JComboBox[,120,6,37x25,无效,layout=javax.swing.plaf.basic.basicmboboxUI$Handler,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth。SynthBorder@f77fca,flags=320,maximumSize=,minimumSize=,preferredSize=,IsEdit=false,lightWeightPopupEnabled=true,maximumRowCount=8,SelectedItemRemembers=2015]

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


我不敢相信这是为了这样工作,那么我做错了什么呢?

在选择“年”组合时,您填写“月”组合,因此事件被触发。相应地,选择已更改,因此会填充dayCombo以触发事件

有两种方法:

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

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


  • 在“年”组合中选择时,您填写“月”组合,以便触发事件。相应地,选择已更改,因此会填充dayCombo以触发事件

    有两种方法:

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

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


  • 你有没有可能也通过GUI添加了事件处理程序?你有没有可能也通过GUI添加了事件处理程序?我没有意识到组合框都在互相调用,干得好。我没有意识到组合框都在互相调用,干得好。