格式化文本时,JFormattedTextfield.selectAll()不起作用

时间:2015-11-25 14:48:01

标签: java settext jformattedtextfield selectall

我有很多不同的JFormattedTextFields,包含action和keylisteners。每个Field都有一个keylistener,所以当我按下回车时,我将关注下一个JFormattedTextField。问题是,对于一些JFormattedTextFields,我的代码正在格式化输入,然后将文本设置为new,而对于那些selectAll()不起作用。

JFormattedTextField a = new JFormattedTextField(someDouble);
JFormattedTextField b = new JFormattedTextField(someDouble2);
a.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            leasingfaktor1Field.selectAll();
            if(...) {
                //do something
                a.setText(tausenderPunkt(someValue));
            }   
        }
    });
a.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == 10) {
                b.requestFocusInWindow();
            }
        }
    });
b.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            leasingfaktor1Field.selectAll();
            if(...) {
                //do something
                b.setText(tausenderPunkt(someValue));
            }   
        }
    });
b.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == 10) {
                c.requestFocusInWindow();
            }
        }
    });

函数tausenderPunkt():

public String tausenderPunkt(double value) {
    String s = String.format("%1$,.2f", value);
    return s;
}

因此,当我的光标位于字段a中并且按下输入时,光标将转到字段b,但不会选择文本或值。当我不使用setText()时,我没有问题。有人有解决方案吗?

编辑:对于一些JFormattedTextFields,解决方案是将selectAll()添加到keyAdapter,但不是全部。 例如:

b.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == 10) {
                c.requestFocusInWindow();
                c.selectAll();
            }
        }
    });

EDIT2: 问题似乎是当我创建JFormattedTextFields时。 当我不在构造函数中使用值创建它时,它可以工作。 但我必须这样做。

2 个答案:

答案 0 :(得分:1)

在移动到下一个文本字段之前,您应该考虑处理当前关注的文本字段的所有必需条件,这当然包括提供给该字段的值或文本的格式。满足所有所需条件后,转到下一个文本字段。

实际上,这可以通过针对您的特定情况的keyPressed事件来完成。您不需要在任何文本字段上使用actionPerformed事件,例如:

com.example.hello

这是一个简单的方法,以消除重复代码的需要:

a.addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            checkConditions(a, b);
        }
    }
});

b.addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            checkConditions(b, c);
        }
    }
});
//----------  and so on  -------------

如果您希望第一个文本字段的内容在其上建立焦点后立即突出显示(选项卡或单击),则考虑对该组件或您希望相同的任何其他组件使用FocusGained事件效果。

我希望这在某种程度上有所帮助。

<强> EDITED!

以便处理OP的特定情况。

答案 1 :(得分:0)

String str=this.getText();
this.setText(str);
this.selectAll();