当前位置: 技术问答>java相关
关于java写gui,提问。(关于事件处理方面)
来源: 互联网 发布时间:2014-12-26
本文导语: 我定了这么一个规则:TextField如果值为“”,则不允许失去焦点,以下这么几种方法请大虾指教: protected void processFocusEvent(FocusEvent e){ //method 1 super.processFocusEvent(e); if( e.getID() ...
我定了这么一个规则:TextField如果值为“”,则不允许失去焦点,以下这么几种方法请大虾指教:
protected void processFocusEvent(FocusEvent e){
//method 1
super.processFocusEvent(e);
if( e.getID() == FocusEvent.FOCUS_LOST){
if(getText().equals("")){
JOptionPane.showMessageDialog( null,
"inputerror",
"InputError",
JOptionPane.ERROR_MESSAGE);
this.requestFocus();
}
}
}
症状:message会弹出两次;
解释:据本菜鸟猜测,可能是弹出这个东西本身也会触发lostfocus;
问题:为什么不是无限次呢?
改进后:protected void processFocusEvent(FocusEvent e){
//method 2
if( e.getID() == FocusEvent.FOCUS_LOST){
if(getText().equals("")){
JOptionPane.showMessageDialog( null,
"inputerror",
"InputError",
JOptionPane.ERROR_MESSAGE);
}else{
super.processFocusEvent(e);
}
}else{
super.processFocusEvent(e);
}
}
症状:这下更惨,还是弹出两次,然后整个画面的focus就乱了。
解释:没有。
问题:是不是事件没有处理干净?
再改进:protected void processFocusEvent(FocusEvent e){
//method 3
super.processFocusEvent(e);
if( e.getID() == FocusEvent.FOCUS_LOST){
if( checkFlg ){
checkFlg = !(getText().equals(""));
super.processFocusEvent(e);
if ( !checkFlg ){
JOptionPane.showMessageDialog( null,
"inputerror",
"InputError",
JOptionPane.ERROR_MESSAGE);
this.requestFocus();
}
}else{
checkFlg = true;
}
}
}
注:checkFlg是在class中定义的boolean型变量,初始为true。
症状:这下子倒是看起来没问题了,不过我当时这么作纯粹是为了避免那个两次弹出的问题。具体为什么?我也不知道。
解释:没有。
问题:n多。
相关问题:
如果你是用tab键迁移焦点,还只能看出上述现象,假如你直接按下另一个button,你就会发现:等你的焦点回到textfield后,你再把鼠标移到那个被你按过的button上,他就会出现“按下”的显示状态。
原因:本菜鸟猜测,button的UI在paintButtonPressed的时候,根本没有考虑是否占据焦点,也确实是这个样子的。可是触发这个函数的是哪里呢?难道那个地方也没有判断吗?
protected void processFocusEvent(FocusEvent e){
//method 1
super.processFocusEvent(e);
if( e.getID() == FocusEvent.FOCUS_LOST){
if(getText().equals("")){
JOptionPane.showMessageDialog( null,
"inputerror",
"InputError",
JOptionPane.ERROR_MESSAGE);
this.requestFocus();
}
}
}
症状:message会弹出两次;
解释:据本菜鸟猜测,可能是弹出这个东西本身也会触发lostfocus;
问题:为什么不是无限次呢?
改进后:protected void processFocusEvent(FocusEvent e){
//method 2
if( e.getID() == FocusEvent.FOCUS_LOST){
if(getText().equals("")){
JOptionPane.showMessageDialog( null,
"inputerror",
"InputError",
JOptionPane.ERROR_MESSAGE);
}else{
super.processFocusEvent(e);
}
}else{
super.processFocusEvent(e);
}
}
症状:这下更惨,还是弹出两次,然后整个画面的focus就乱了。
解释:没有。
问题:是不是事件没有处理干净?
再改进:protected void processFocusEvent(FocusEvent e){
//method 3
super.processFocusEvent(e);
if( e.getID() == FocusEvent.FOCUS_LOST){
if( checkFlg ){
checkFlg = !(getText().equals(""));
super.processFocusEvent(e);
if ( !checkFlg ){
JOptionPane.showMessageDialog( null,
"inputerror",
"InputError",
JOptionPane.ERROR_MESSAGE);
this.requestFocus();
}
}else{
checkFlg = true;
}
}
}
注:checkFlg是在class中定义的boolean型变量,初始为true。
症状:这下子倒是看起来没问题了,不过我当时这么作纯粹是为了避免那个两次弹出的问题。具体为什么?我也不知道。
解释:没有。
问题:n多。
相关问题:
如果你是用tab键迁移焦点,还只能看出上述现象,假如你直接按下另一个button,你就会发现:等你的焦点回到textfield后,你再把鼠标移到那个被你按过的button上,他就会出现“按下”的显示状态。
原因:本菜鸟猜测,button的UI在paintButtonPressed的时候,根本没有考虑是否占据焦点,也确实是这个样子的。可是触发这个函数的是哪里呢?难道那个地方也没有判断吗?
|
hehe,看看java的源程序吧,我的好多问题就是这么找到的!
有一点可以证明的是:当你弹出一个模式的对话框(如MessageDialog)时,整个窗口的输入焦点就会汇集到对话框上,所有的窗口组件(时间源)都会产生一个FOCUS_LOST消息,这就是为什么对话框会弹出两次的原因。看得出,你最后的解决方案说明你一看出了这一点 8)。
看得出老兄,你是个爱钻研问题的程序员,呵呵,加油呀!
有一点可以证明的是:当你弹出一个模式的对话框(如MessageDialog)时,整个窗口的输入焦点就会汇集到对话框上,所有的窗口组件(时间源)都会产生一个FOCUS_LOST消息,这就是为什么对话框会弹出两次的原因。看得出,你最后的解决方案说明你一看出了这一点 8)。
看得出老兄,你是个爱钻研问题的程序员,呵呵,加油呀!
|
processFocusEvent是什麽呀,是你自己定义的方法吗