当前位置: 首页 > 知识库问答 >
问题:

使用多个JComboBox;但它们都得到任何操作事件

哈涵容
2023-03-14

我敢肯定,我在做一些非常愚蠢的事情;但它已经困扰我好几个小时了。我用的是NetBeans 8。如果有帮助的话。我有一个带有多个组合框的表单,可以从数据集中进行选择。首先选择年份,然后填充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年项目时日志()的输出。

2015年组合项目

月组合项2015源代码javax.swing.JComboBox[,77,6,37x25,无效,布局=javax.swing.plaf.basic.BasicComboBoxUI$Handler,对准X=0.0,对准Y=0.0,边框=javax.swing.plaf.synth.SynthBorder@1b2a5dc,标志=320,最大尺寸=,最小尺寸=, preferredSize=, isEdable=false, light WeghtPopupEnable=true,最大RowCount=8, selectedItemReminder=2015]

Day combo item 2015源javax。摆动JComboBox[,120,6,37x25,无效,layout=javax.swing.plaf.basic.basicComboxUI$Handler,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth。SynthBorder@f77fca,flags=320,maximumSize=,minimumSize=,preferredSize=,isEditable=false,lightWeightPopupEnabled=true,maximumRowCount=8,selectedItemReminder=2015]

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

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

共有1个答案

施飞驰
2023-03-14

在选择年份组合时,您填写月份组合,以便触发事件。因此,选择发生了变化,以便填充日组合以触发事件。

有2种方法:

>

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

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

  •  类似资料:
    • 问题内容: 我试图获得两个计数,然后将这两个计数相除,以得出我所计数的项目的比率。我在这里看到了这篇文章,并尝试了。我的结果出现错误,没有错误消息,只是错误的数字。我正在使用SQL Server 2008 这是我的代码: 计数正确产生并显示,但是对于比率,我为0,并且不确定为什么会得到此值。 谢谢你, 问题答案: 使用 SQL Server认为A.NUM / A.DENOM是int,因为A.NUM

    • 我有一个类,它基本上会做两次相同的步骤。听起来像是一个在哪里多线程处理程序的完美例子。我的问题是,如果我只需要两个线程就可以做到这一点。以下是一般情况 我已经完成了第一部分——构建对象——的工作。我现在的问题是- 如何让主线程等待两个线程完成其第一部分?也许main会在两个对象上执行等待,然后在线程notifyAll之后,它们会在主线程上执行等待?但是线程如何抓住主线程呢?也许用这个 我怎样才能在

    • 我在读一篇文章: 根据他们的说法,如果您需要将用于不同的目的,您需要为每个目的创建不同的功能(用于WIN8中的瓷砖,Opera和Chrome中的快速拨号)。 好的,我仍然使用一个16x16文件,我认为它适合用于优化目的。 但是现在看完这些文章后,我有各种各样的问题,比如(假设我使用photoshop为不同的目的创建了不同的图标): -为了指定的目的,在(file)中的哪个位置应该添加哪些行()代码

    • 我正在react JS中呈现Html,即: 现在我想点击图像执行JQuery操作。我已经尝试了onhtml,现在尝试以下JQuery代码 这是JQuery代码,但它没有显示任何内容。只有html呈现该操作未执行。

    • 问题内容: 我想为它的onTapDown回调使用GestureDetector,但也具有不错的InkWell飞溅效果。 可以同时使用这两个吗? 问题答案: 如果要无条件处理指针向下事件而不会造成歧义,可以将InkWell设为Listener的子级,并设置onPointerDown处理程序。 例如: 向InkWell添加onTapDown处理程序可能是有意义的。

    • 我开发了一个Python应用程序来访问GDrive,现在我希望在GDrive上的任何文件被更改时得到通知。特别是我对移动/重命名,删除,下载和上传事件感兴趣。我看到Google提供了2个工具: 这些对我来说都不是最佳的,因为我需要关于GDrive上发生的所有与文件系统相关的事件的全局通知。有替代方案吗?我知道DropBox支持这个。