gpt4 book ai didi

java - 使用多个 JComboBox;但他们都会收到任何 Action 事件

转载 作者:行者123 更新时间:2023-12-01 18:14:08 24 4
gpt4 key购买 nike

我确信我在这里做了一些非常愚蠢的事情;但这已经困扰我好几个小时了。我正在使用 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,invalid,layout=javax.swing.plaf.basic.BasicComboBoxUI$Handler,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]

日组合项 2015 源 javax.swing.JComboBox[,120,6,37x25,invalid,layout=javax.swing.plaf.basic.BasicComboBoxUI$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]

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

我不敢相信这就是这样的,所以我做错了什么?

最佳答案

在选择年份组合时,您填写月份组合,以便触发事件。因此,选择发生了更改,因此填充了 dayCombo 并触发了该事件。

有两种方法:

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

  2. 在更新模型之前从组合框中删除监听器,并在填充模型后读取

关于java - 使用多个 JComboBox;但他们都会收到任何 Action 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30762338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com