|
蓝森林 http://www.lslnet.com 2006年6月6日 10:18
!!为什么JOptionPane.showMessageDialog(。。)会弹出两次!
又是好久没写J2SE了,今天用一下,
结果在public void itemStateChanged(ItemEvent e1)方法用到弹出框时JOptionPane.showMessageDialog(。。)会弹出两次!
但在public void actionPerformed(ActionEvent e)方法也用到弹出框却正常。
搞了半天都还是没有解决。来此请教大家帮忙解决一下,先谢了!
|
代码...
怎么监听的?监听的啥? |
应该是 itemStateChanged(ItemEvent e1) 这个被触发了两次,你想下你做的操作,再去文档看下这个方法的说明。 |
多谢各位的回复!
代码如下:
public void itemStateChanged(ItemEvent e1)
{
if(e1.getItemSelectable()==jcb1)
{
alarmyear=Integer.parseInt((String)jcb1.getSelectedItem());
//System.out.println("jcb1:"+alarmyear);
}
else if(e1.getItemSelectable()==jcb2)
{
alarmmonth=Integer.parseInt((String)jcb2.getSelectedItem());
//System.out.println("jcb2:"+alarmmonth);
}
else if(e1.getItemSelectable()==jcb3)
{alarmday=Integer.parseInt((String)jcb3.getSelectedItem());
//判断是否为闰年
if((alarmmonth==2)&&(alarmday>28+isLeapYear(alarmyear)))
JOptionPane.showMessageDialog(this,"选择有误!","警告",JOptionPane.WARNING_MESSAGE);
else if(alarmday>30)
{if((alarmmonth==4)||(alarmmonth==6)||(alarmmonth==9)||(alarmmonth==11))
JOptionPane.showMessageDialog(this,"选择有误!","警告",JOptionPane.WARNING_MESSAGE);
}
else
{
//System.out.println("jcb333:"+alarmday);
}
}
}
|
监听被注册了两次,又或是有两个事件被触发 |
那请问应该怎么处理?
多谢! |
调查一下原因,前者去掉无用的注册;后者,使用别的事件监听,比如ActionListener |
-->
我想请教一下您所说的前一种解决方法(去掉无用的注册),我在程序中只注册了一次。
就
jcb1.addItemListener(this);
jcb2.addItemListener(this);
jcb3.addItemListener(this);
对于我这个程序来说用后一种方法不太好。
谢谢您的回复! |
建议你别在panel或者frame上implements XxxListener
这样你很有容易在判断事件源上出错误
老老实实重新实现一个ItemListener创建3个对象,分别注册到3个事件源上可能你的问题就没了
Item事件经常会有你改变一个state,另外一个item上也会有一个state想应改变的。 |
-->
如果只是这样那么应该没有注册多余的listener,就应该从另一个角度调查,看看哪些事件会触发这个listener,是否有一种被你忽略了,比如focuslost。
艾同学说的很对,不要图省事用一个Frame搞了n多方法,ui的,监听的,接口的,父类的,,最后就是一团糟:em23: |
应该是由于 选择一个 item 就会触发一次 上次选中 item 的 diselect 事件 和这一次选中的 item 的 select 事件。 |
多谢各位!
问题查出来了,是因为我在程序中用了
/* //此部分不能要,否则下面的itemStateChanged事件会触发两次
ActionListener exitAction=new ActionListener()
{public void actionPerformed(ActionEvent e2)
{dispose();}
}; */
屏蔽掉就没事了。 |
-->
恩,感觉就是应该是这样造成了两个stateChange而监听器判断事件源的时候可能由于逻辑上的疏忽两个都处理了 |
| |