蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程


    

蓝森林 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而监听器判断事件源的时候可能由于逻辑上的疏忽两个都处理了



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com