0

私のアプリケーションには JFormattedTextFields があり、現金の値を表示しています。

最初はすべてのフィールドが 0.00f に設定されています。

ただし、フォーカスがある最初のコンポーネントの値は「.00」と表示されます。その他は期待どおりに値を表示します。

フォーマットされたテキストフィールドにフォーカスがある場合、表示値を「0.00」にする方法を教えてください。

以下はMmyのサンプルコードです。

import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;


public class MainFrame extends JFrame {

    public MainFrame()
    {
    setSize(300, 300);
    }
    /**
     * @param args
     */
    public static void main(String[] args) 
    {
    final MainFrame frame = new MainFrame();
    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(3, 1));

    ExtedndedFormattedTextField tf = new ExtedndedFormattedTextField();
    tf.setAmount(0.00f);

    ExtedndedFormattedTextField tf1 = new ExtedndedFormattedTextField();
    tf1.setAmount(0.00f);

    ExtedndedFormattedTextField tf2 = new ExtedndedFormattedTextField();
    tf2.setAmount(0.00f);

        tf.setColumns(20);
        panel.add(tf);
        panel.add(tf1);
        panel.add(tf2);

        frame.add(panel);
        frame.pack();
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
        frame.setVisible(true);

        }
    });
    }

}

    class ExtedndedFormattedTextField extends JFormattedTextField
    {
        private String negativeSymbol = "";
        public ExtedndedFormattedTextField()
        {
        super();
        setFormatterFactory(getCurrencyFormaterFactory());
        this.addFocusListener(new FocusListener() {

            @Override
            public void focusLost(FocusEvent e) {


            }

            @Override
            public void focusGained(FocusEvent e) {
            SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {
                select(0, getText().length());

                }
            });


            }
        });
        }

        private AbstractFormatterFactory getCurrencyFormaterFactory()
        {
            NumberFormatter displayFormatter = new NumberFormatter(DecimalFormat.getCurrencyInstance());
            DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
            negativeSymbol = String.valueOf(formatSymbols.getMinusSign());
            NumberFormatter editFormatter = new NumberFormatter(new DecimalFormat("#.00",
                formatSymbols));
            editFormatter.setAllowsInvalid(false);
            editFormatter.setOverwriteMode(false);
            return new DefaultFormatterFactory(displayFormatter, displayFormatter, editFormatter);
        }

        public float getAmount()
        {
            try
            {
              commitEdit();
            }
            catch (ParseException e)
            {
              return 0;
            }

            Object o = getValue();
            if (o instanceof Number)
            {
                return ((Number) getValue()).floatValue();
            }
            return 0;
        }

        public void setAmount(float amount)
        {
            setValue(new Float(amount));
        }

        @Override
        public boolean requestFocusInWindow() {
        this.select(0, getText().length()); 
        return super.requestFocusInWindow();
        }


    }
4

2 に答える 2

0

フォーマッタで # 文字を使用すると、ゼロが存在しないと表示されます。スキップしないように 0 を使用します。だから変更:

NumberFormatter editFormatter = new NumberFormatter(new DecimalFormat("#.00", formatSymbols));

NumberFormatter editFormatter = new NumberFormatter(new DecimalFormat("0.00", formatSymbols));
于 2013-11-13T12:24:47.243 に答える