gpt4 book ai didi

java - 如何识别事件的来源..?

转载 作者:行者123 更新时间:2023-11-30 09:51:29 26 4
gpt4 key购买 nike

JComboBox.removeAllItems() 方法会触发 ItemStateChanged 事件吗?
如果是这样,我如何确定事件是由于用户操作还是由于方法 removeAllItems().. 的调用而生成的天气?
我在组合框的 itemStateChanged() 方法中有一些代码,当用户在组合框中更改他的选择时它会工作正常,但根据代码的性质,它在调用时抛出空指针异常由于在该组合框上调用 removeAllItems()。如果我能确定事件的原因是 removeAllItems() 方法并返回控件,那么我的问题就解决了。我该怎么做...?
更新
在你们提出答案后,我使用了以下代码...

 @Override
public void itemStateChanged(ItemEvent e) {
if(e.getSource()==branch_list)
{
if(!UserConstants.FID.contains("hod"))
{
ignoreEvents=true;//static boolean variable not used by any other methods
year_list.removeAllItems();
year_list.addItem(" ");
sem_list.removeAllItems();
sem_list.addItem(" ");
branch_list.removeAllItems();
branch_list.addItem(" ");
if(branch_list.getSelectedItem().equals(" "))
return;
Iterator year_it=DatabaseConnector.map.get(branch_list.getSelectedItem().toString()).keySet().iterator();
while(year_it.hasNext())
{
year_list.addItem(year_it.next());

}
ignoreEvents=false;
}
return;
}
else if(e.getSource()==year_list)
{
if((branch_list.getSelectedItem()==null)||branch_list.getSelectedItem().toString().equals(" ")||ignoreEvents)
return;
sem_list.removeAllItems();
section_list.removeAllItems();
sem_list.addItem(" ");
section_list.addItem(" ");
Iterator i=DatabaseConnector.map.get(branch_list.getSelectedItem().toString()).get(year_list.getSelectedItem().toString()).iterator();
int first=0;
while(i.hasNext())
{
String cur=i.next().toString();
if(first==0)
{
sem_list.addItem(cur.charAt(0));
section_list.addItem(cur.charAt(1));
first++;
}
else
{
section_list.addItem(cur.charAt(1));
}

}


}

}
I am getting the following error:-
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at sun.nio.cs.SingleByteEncoder.encodeArrayLoop(SingleByteEncoder.java:91)
at sun.nio.cs.SingleByteEncoder.encodeLoop(SingleByteEncoder.java:130)
at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
at java.io.PrintStream.write(PrintStream.java:476)
at java.io.PrintStream.print(PrintStream.java:619)
at java.io.PrintStream.println(PrintStream.java:756)
at attendence.Home.itemStateChanged(Home.java:427)

等等......

最佳答案

我相信你最好的选择是要么

  1. 当您对事件不感兴趣时​​移除监听器,即使它是临时的

    cb.removeItemListener(listener);
    cb.removeAllItems();
    cb.addItemListener(listener);

    或者,

  2. 引入一个名为 ignoreEvents 的 boolean 变量并执行

    ignoreEvents = true;
    cb.removeAllItems();
    ignoreEvents = false;

    并让处理程序方法遵守 ignoreEvents 值。


关于您的更新:

你需要有

if (ignoreEvents == true)
return;

在处理程序的顶部。此外,在您的

if(branch_list.getSelectedItem().equals(" "))
return;

您没有将 ignoreEvents 设置回 false。您可以使用 try/finally 来确保从方法返回时 ignoreEvents 始终设置回 false。

关于java - 如何识别事件的来源..?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4669286/

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