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

JFormattedTextfield.selectAll() does not work when formatting the text

我有很多不同的 JFormattedTextFields,带有操作和键监听器。每个 Field 都有一个 keylistener,所以当我按下回车键时,我将关注下一个 JFormattedTextField。问题是,对于某些 JFormattedTextFields,我的代码正在格式化输入,然后设置新文本,对于那些 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 但不会 select 文本或值。当我不使用 setText() 时,我没有问题。有人有解决方案吗?

编辑:对于某些 JFormattedTextFields,解决方案是将 selectAll() 添加到 keyAdapter,但不是针对所有的。 例如:

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

编辑2: 问题似乎出在我创建 JFormattedTextFields 时。 当我不在构造函数中使用值创建它们时,它会起作用。 但我不得不做。

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

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

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  -------------

这里有一个简单的方法来消除重复代码的需要:

private void checkConditions(JFormattedTextField fieldA, JFormattedTextField fieldB) {
    // Make sure something is contained within fieldA and 
    // that it's actually numerical text.
    if(!fieldA.getText().isEmpty() && 
                fieldA.getText().matches("([-]?)\d+([,]\d+)?(([.]\d+)?)")) {
        // Convert the supplied text to Double and
        // ensure the desired numerical formating.
        String res = (String)tausenderPunkt(Double.parseDouble(fieldA.getText().replace(",","")));
        fieldA.setText(res);
        // Set Focus to our next text fieldB.
        fieldB.requestFocusInWindow();
        // Highlight the contents (if any) within the
        // next text fieldB.
        fieldB.selectAll();
    }
    // If fieldA is empty or fieldA does not contain 
    // numerical text then inform User and re-highlight
    // the entry in fieldA.
    else {
        JOptionPane.showMessageDialog (null, "Please Enter Numerical Values Only!", 
                "Incorrect Entry", JOptionPane.WARNING_MESSAGE);
        fieldA.selectAll();
    }
}

如果您希望第一个文本字段的内容在获得焦点(切换到或单击)后立即突出显示,请考虑对该组件或您需要的任何其他组件使用 FocusGained 事件同样的效果。

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

已编辑!

为了处理OP的特殊情况。

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