JFormattedTextField не устанавливает значение при вводе суммы и отсутствии значка турецкой лиры TL

Вот мой класс для правильного отображения суммы в турецких лирах, мой класс не устанавливает введенную сумму, например, если я ввожу 1200, это должно быть 1200 TL, я пропустил шаг здесь? Должен ли я добавить событие выполнения действия или событие отпускания клавиши?

public class TurkisliraFormatterDemo extends JPanel
        implements PropertyChangeListener {

    private double amount = 100000;
    private JFormattedTextField amountField;

    private NumberFormat amountDisplayFormat;
    private NumberFormat amountEditFormat;

    public TurkisliraFormatterDemo() {
        super(new BorderLayout());
        setUpFormats();

        amountField = new JFormattedTextField(
                new DefaultFormatterFactory(
                        new NumberFormatter(amountDisplayFormat),
                        new NumberFormatter(amountDisplayFormat),
                        new NumberFormatter(amountEditFormat)));
        amountField.setValue(new Double(amount));
        amountField.setColumns(10);
        amountField.addPropertyChangeListener("value", this);

        JPanel fieldPane = new JPanel(new GridLayout(0, 1));
        fieldPane.add(amountField);

        setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

        add(fieldPane, BorderLayout.LINE_END);
    }

    public void propertyChange(PropertyChangeEvent e) {
        Object source = e.getSource();
        if (source == amountField) {
            amount = ((Number) amountField.getValue()).doubleValue();
            amountField.setValue(amount);
        }

    }

    private static void createAndShowGUI() {

        JFrame frame = new JFrame("FormatDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(new TurkisliraFormatterDemo());

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                UIManager.put("windows", Boolean.FALSE);
                createAndShowGUI();
            }
        });
    }

    private void setUpFormats() {
        amountDisplayFormat = NumberFormat.getCurrencyInstance(new Locale("tr", "TR"));
        amountDisplayFormat.setMinimumFractionDigits(0);
        amountEditFormat = NumberFormat.getNumberInstance();

    }
}

person mussdroid    schedule 26.08.2014    source источник


Ответы (1)


Поле не будет отформатировано, пока оно находится в фокусе, пытаясь добавить другой компонент в пользовательский интерфейс и переместить на него фокус.

Это означает, что в режиме «редактирования» он будет использовать средство форматирования редактора, но будет использовать средство форматирования отображения, когда оно не

Поле

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.NumberFormat;
import java.util.Locale;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;

public class TurkisliraFormatterDemo extends JPanel
                implements PropertyChangeListener {

    private double amount = 100000;
    private JFormattedTextField amountField;

    private NumberFormat amountDisplayFormat;
    private NumberFormat amountEditFormat;

    public TurkisliraFormatterDemo() {
        super(new BorderLayout());
        setUpFormats();

        amountField = new JFormattedTextField(
                        new DefaultFormatterFactory(
                                        new NumberFormatter(amountDisplayFormat),
                                        new NumberFormatter(amountDisplayFormat),
                                        new NumberFormatter(amountEditFormat)));
        amountField.setValue(new Double(amount));
        amountField.setColumns(10);
        amountField.addPropertyChangeListener("value", this);

        JPanel fieldPane = new JPanel(new GridLayout(0, 1));
        fieldPane.add(amountField);

        setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

        add(fieldPane, BorderLayout.LINE_END);
        add(new JButton("Hello"), BorderLayout.SOUTH);
    }

    public void propertyChange(PropertyChangeEvent e) {
        Object source = e.getSource();
        if (source == amountField) {
            amount = ((Number) amountField.getValue()).doubleValue();
            System.out.println("amount = " + amount);
//            amountField.setValue(amount);
        }

    }

    private static void createAndShowGUI() {

        JFrame frame = new JFrame("FormatDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(new TurkisliraFormatterDemo());

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                UIManager.put("windows", Boolean.FALSE);
                createAndShowGUI();
            }
        });
    }

    private void setUpFormats() {
        amountDisplayFormat = NumberFormat.getCurrencyInstance(new Locale("tr", "TR"));
        System.out.println(amountDisplayFormat.format(1200));
        amountDisplayFormat.setMinimumFractionDigits(0);
        amountEditFormat = NumberFormat.getNumberInstance();

    }
}
person MadProgrammer    schedule 26.08.2014
comment
поэтому, когда я нажимаю на приветствие, фокус меняется на кнопку приветствия? - person mussdroid; 26.08.2014
comment
Да, если вы перефокусируете поле, его формат снова изменится на формат редактора... - person MadProgrammer; 26.08.2014
comment
Могу ли я использовать событие движения мыши, чтобы повлиять на мое поле, потому что я не хочу помещать кнопку в свой графический интерфейс? - person mussdroid; 26.08.2014
comment
можем ли мы иметь невидимую неявно нажатую кнопку? - person mussdroid; 26.08.2014
comment
еще один вопрос после потери фокуса и установки 1200 TL, является ли переменная строкой или большим десятичным числом, если я хочу получить значение и сохранить в базе данных? - person mussdroid; 26.08.2014
comment
Технически это Long, но вы сможете сделать из него все, что захотите.. - person MadProgrammer; 26.08.2014
comment
Привет, сумасшедший программист, как ты делаешь анимацию, подобную этой выше? - person mussdroid; 29.08.2014
comment
@okrman А, коммерческая тайна ;) Я использую инструмент под названием LICEcap, он довольно простой, но кроссплатформенный - person MadProgrammer; 29.08.2014
comment
это бесплатное ПО? сумасшедший программист, я действительно хочу работать с тобой и улучшать себя, ты потрясающий! спасибо - person mussdroid; 29.08.2014