1

我有以下代码:

public test() {
    setLayout(new FlowLayout());
    JFormattedTextField price = new JFormattedTextField(new DecimalFormat("#,##0.00 \u00A4"));
    price.setValue(new Float(105.00));
    add(price);
    add(new JButton("Ok"));

    pack();
    setVisible(true);

}

如果我现在输入一个数字,例如“20”。文本字段再次输入“105.00”。为什么它不接受我的输入并且总是回到默认值?

4

2 回答 2

2

您的 decimalFormat 无法正常工作。

尝试删除,

之后 20 欧元有效

但请注意,您仍然必须在数字后输入空格和€符号

于 2012-11-27T10:47:19.583 回答
2

与第 1 点和第 2 点相比,共有三种方法,从最简单开始,以无用结尾,可能是胡说八道。

  • 使用NumberFormat.getCurrencyInstance();or NumberFormat.getCurrencyInstance(Locale);for Currency symbol, 那么这个值对具体JTextField/ JFormattedTextField/ JSpinner/ XxxCellRenderer/有效XxxCellEditor,

代码

import java.awt.GridLayout;
import java.math.RoundingMode;
import java.text.NumberFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.text.NumberFormatter;

public class MaskFormatterTest {

    public static void main(String[] args) throws Exception {
        //NumberFormat format = NumberFormat.getNumberInstance();
        NumberFormat format = NumberFormat.getCurrencyInstance();
        format.setMaximumFractionDigits(2);
        format.setMinimumFractionDigits(2);
        format.setParseIntegerOnly(true);
        format.setRoundingMode(RoundingMode.HALF_UP);

        NumberFormatter formatter = new NumberFormatter(format);
        formatter.setMaximum(1000.0);
        formatter.setMinimum(0.0);
        formatter.setAllowsInvalid(false);
        formatter.setOverwriteMode(false);

        JFormattedTextField tf = new JFormattedTextField(formatter);
        tf.setColumns(10);
        tf.setValue(123456789.99);
        JFormattedTextField tf1 = new JFormattedTextField(formatter);
        tf1.setValue(1234567890.99);
        JFormattedTextField tf2 = new JFormattedTextField(formatter);
        tf2.setValue(1111.1111);
        JFormattedTextField tf3 = new JFormattedTextField(formatter);
        tf3.setValue(-1111.1111);
        JFormattedTextField tf4 = new JFormattedTextField(formatter);
        tf4.setValue(-56);

        JFrame frame = new JFrame("Test");
        frame.setLayout(new GridLayout(5, 0));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(tf);
        frame.add(tf1);
        frame.add(tf2);
        frame.add(tf3);
        frame.add(tf4);
        frame.pack();
        frame.setVisible(true);
    }
}

.

  • 应用自己的NavigationFilter,固定位置可以在////中位置(偏差)的开始JTextField或结束JFormattedTextFieldJSpinnerXxxCellRendererXxxCellEditor

代码

//@see & read http://stackoverflow.com/questions/7421337/limited-selection-in-a-jtextfield-jtextcomponent
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class NavigationFilterPrefixWithBackspace extends NavigationFilter {

    private int prefixLength;
    private Action deletePrevious;

    public NavigationFilterPrefixWithBackspace(int prefixLength, JTextComponent component) {
        this.prefixLength = prefixLength;
        deletePrevious = component.getActionMap().get("delete-previous");
        component.getActionMap().put("delete-previous", new BackspaceAction());
        component.setCaretPosition(prefixLength);
    }

    @Override
    public void setDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) {
        fb.setDot(Math.max(dot, prefixLength), bias);
    }

    @Override
    public void moveDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) {
        fb.moveDot(Math.max(dot, prefixLength), bias);
    }

    class BackspaceAction extends AbstractAction {

        private static final long serialVersionUID = 1L;

        public void actionPerformed(ActionEvent e) {
            JTextComponent component = (JTextComponent) e.getSource();
            if (component.getCaretPosition() > prefixLength) {
                deletePrevious.actionPerformed(null);
            }
        }
    }

    public static void main(String args[]) throws Exception {
        JTextField textField = new JTextField("Prefix_", 20);
        textField.setNavigationFilter(new NavigationFilterPrefixWithBackspace(7, textField));
        JFrame frame = new JFrame("Navigation Filter Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(textField);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

.

  • 创建自己InputMaskInputVerifier, workaroung 可以/不能为(每个)JTextField/ JFormattedTextField/ JSpinner/ XxxCellRenderer/不同XxxCellEditor
于 2012-11-27T11:40:27.367 回答