发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 SOA

Jdk1.4.1新的焦点控制系统的问题: 1.3下的焦点控制代码在1.4.1下运行出现死循环

2002-10-24 13:36
赞助商链接

banq:
你好!我是一个Java新手经常访问你的网站受益非浅, 有一问题请教:
以下是我在一个项目中的代码片段, 以前在JDK1.3下开发运行没有问题后来升级到1.4后却出现死循环:

public class tt extends JPanel {
private JTextField txtName = new JTextField();
private JButton jButton1 = new JButton();
private JTextField jTextField1 = new JTextField();

public tt() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
txtName.setText("jTextField1");
jButton1.setText(
"jButton1");
jTextField1.setText(
"jTextField1");
this.add(txtName, null);
this.add(jButton1, null);
this.add(jTextField1, null);

txtName.setInputVerifier(new SellerVerifier());
}
public static void main(String[] args) {
JFrame window = new JFrame(
"test");
tt tt1 = new tt();
window.getContentPane().add(
"Center", tt1);
window.setDefaultCloseOperation(window.EXIT_ON_CLOSE);
window.setSize(300,200);
window.setVisible(true);
}

class SellerVerifier extends InputVerifier {
public boolean verify(JComponent input){
JTextField si = (JTextField)input;
String str = si.getText();
if (str.trim().equalsIgnoreCase(
"")){
JOptionPane.showMessageDialog(null,
"输入不能为空!", "ViTop", JOptionPane.ERROR_MESSAGE);
return false;
}
return true;
}
}
}

经跟踪调试后发现: 当我调用JOptionPane.showMessageDialog时,JoptionPane类内部会设置默认控件并为其请求焦点(即调用requestFocus()函数, 而requestFocus在设置焦点以前会让失去焦点的对象先作输入验证。在1.4.1的焦点系统中就是调用上面代码中的txtName的验证代码, 也就出现了死循环。 而在1.3的焦点系统中则不会! 这算不算是JDK的一个Bug呢?
不知banq有没有好的解决法?

2002-10-24 20:21

对图形方面研究不够,哪位能出手帮忙

2005-01-04 16:48

今天也碰到这个问题,改一下:

class SellerVerifier extends InputVerifier {

private boolean tempFocusLost = false;

public boolean verify(JComponent input){

if(tempFocusLost){//for jdk1.4
tempFocusLost = false;
return true;
}

JTextField si = (JTextField)input;
String str = si.getText();
if (str.trim().equalsIgnoreCase(
"")){

tempFocusLost = true;

JOptionPane.showMessageDialog(null,
"输入不能为空!", "ViTop", JOptionPane.ERROR_MESSAGE);
return false;
}
return true;
}
}

2005-01-10 14:46

我在java5下编译运行过了,java5已经修正了这个bug。
倒是xiaofei给出的方案在java5下会有一点小小的问题。

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com