Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Подойдет ли NumberFormatter?


Автор: azz 4.4.2006, 18:19
Мне надо сделать текстовое поле которое отображало duble. (а именно цену). Выглядеть это должно примерно так: 12.345,20. Причем если знаков после запятой нет или толко один - должны дововлятся...
Это можно сделать с FormatedTextField или надо писать свой класс?

Дополнительные вопросы:
1. Как из этого поля получить duble?
2. Какой самый простой способ выделить весь текст в поле?

Автор: Beard 4.4.2006, 19:15
Можно:
Код

        MaskFormatter mf = new MaskFormatter("##.###,##"); 
        mf.setPlaceholderCharacter('0');        
        final JFormattedTextField field = new JFormattedTextField(mf);
        JFrame frame = new JFrame();
        JButton button = new JButton("PushMe");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String number = field.getText();
                double d = Integer.parseInt(number.substring(0, 2)) * 1000 + Integer.parseInt(number.substring(3, 6)) + Double.parseDouble(number.substring(7))/100;
                System.err.println(d);
            }
        });

Наверно, преобразовывать к double надо иначе - воспользоваться каким-нить форматтером или еще что-нить в таком духе

А что значит - выделить (второй пункт)?

Автор: LSD 4.4.2006, 19:35
Цитата(Beard @ 4.4.2006, 20:15 Найти цитируемый пост)
Наверно, преобразовывать к double надо иначе - воспользоваться каким-нить форматтером или еще что-нить в таком духе

Например так:
Код
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
symbols.setGroupingSeparator('.');
DecimalFormat format = new DecimalFormat("##,###.##", symbols);
System.out.println(format.parse("12.345,20").doubleValue());



Цитата(azz @ 4.4.2006, 19:19 Найти цитируемый пост)
2. Какой самый простой способ выделить весь текст в поле?

Код
textField.setSelectionStart(0);
textField.setSelectionEnd(textField.getDocument().getLength());

Автор: Beard 4.4.2006, 19:38
Проще использовать selectAll()
Код

                textField.selectAll();
                textField.getCaret().setSelectionVisible(true);

Автор: azz 4.4.2006, 21:11
Просто не может не радовать тот факт, насколько всеже мир не без добрых людей... Щас начну пробовать и то что получится потом вылвжу сдесь. Всем спасиба!

Автор: azz 5.4.2006, 06:33
А как сделать чтоб 2 знака после запятой добовлялись если они не заданны?

Автор: LSD 5.4.2006, 10:27
Цитата(azz @ 5.4.2006, 07:33 Найти цитируемый пост)
А как сделать чтоб 2 знака после запятой добовлялись если они не заданны?

Так они и будут добавляться. Вначале у тебя JFormattedTextField заполнено нулями. И если пользователь не вобъет свое значение, то там нули и останутся.

Автор: azz 5.4.2006, 13:09
Я пока сто так сделал:
Код

public class MoneyTextField extends JFormattedTextField {
    private DecimalFormat format;
    public MoneyTextField(){

        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
        symbols.setDecimalSeparator(',');
        symbols.setGroupingSeparator('.');
        format = new DecimalFormat("##,###.##", symbols);
        format.setMinimumFractionDigits(2);
                                        setFormatter(format);
        addFocusListener(new FocusAdapter()
            {
                public void focusGained(FocusEvent e) {
                    selectAll();
                    
                }

            });
    }

}

но он не принемает setFormatter(format); Почему?? И что делать?

Автор: Beard 5.4.2006, 13:23
Потому что - разве в JavaDoc ничего не написано?
DecimalFormat предназначен для форматирования decimal numbers, его ты будешь
использовать для получения из строки (что вернет JTextFormatted) double
а JFormattedField::setFormatter() использует JFormattedField.AbstractFormatter для
форматирования своего текста, поэтому надо использовать его реализацию, например
MaskFormatter из моего примера.
Что-нить в таком духе:
Код

public class MoneyTextField extends JFormattedTextField {
    private DecimalFormat format;

    public MoneyTextField() {
        super();
        MaskFormatter mf;
        try {
            mf = new MaskFormatter("##.###,##");
            mf.setPlaceholderCharacter('0');
            setFormatterFactory(new DefaultFormatterFactory(mf));
        } catch (ParseException e1) {
            // never happen
        }
        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
        symbols.setDecimalSeparator(',');
        symbols.setGroupingSeparator('.');
        format = new DecimalFormat("##,###.##", symbols);
        format.setMinimumFractionDigits(2);

        addFocusListener(new FocusAdapter() {
            public void focusGained(FocusEvent e) {
                selectAll();
            }
        });
    }
....
    public double getDouble() {
        double result = 0.0;
        try {
            result = format.parse(getText()).doubleValue();
        } catch (ParseException e) {
            // never happen
        }
        return result;
    }
}

Автор: azz 5.4.2006, 15:31
Все... Вроде закончил . Выношу на ваш суд, оптимезацию... а может кому и пригадится:
1. Класс который мне форматированные поля генерирует:
Код

public class FormatTextFactory {
    
    public final static String datePattern = "d.MM.yyyy";
    public final static String monatPattern = "MM.yyyy";
    public static DecimalFormatSymbols symbols;
    private static FormatTextFactory instance = null;
    private static DecimalFormat moneyFormat;
    
    public final static DateFormat dateFormatter = new SimpleDateFormat(datePattern);
    public final static DateFormat monatFormatter = new SimpleDateFormat(monatPattern);
    
    private FormatTextFactory(){
        symbols = new DecimalFormatSymbols();
        symbols.setDecimalSeparator(',');
        symbols.setGroupingSeparator('.');
        moneyFormat = new DecimalFormat("##,###.##", symbols);
        moneyFormat.setMinimumFractionDigits(2);
        
    }
    
    public static JFormattedTextField getNewDataField(){
        JFormattedTextField result = new JFormattedTextField(dateFormatter);
        return result;
        
    }
    
    public static JFormattedTextField getNewMonatsField(){
        JFormattedTextField result = new JFormattedTextField(monatFormatter);
        return result;
        
    }
    
    public static JFormattedTextField getMoneyField(){
        if(instance == null){
            instance = new FormatTextFactory();
        }
        JFormattedTextField result = new JFormattedTextField(moneyFormat);
        result.addFocusListener(new FocusAdapter()
            {
                public void focusGained(FocusEvent e) {
                    Object obj = e.getSource();
                    ((JFormattedTextField)obj).selectAll();
                    
                }

            });

        return result;
        
        
    }
    
    public static DecimalFormat getMoneyFormat(){
        return moneyFormat;
    }

}


2. Так я загоняю значение в поле:
Код

txtPriceBrutto.setValue(Double.valueOf(car.getPriceBrutto()));

3. А так получаю из него :
Код

car.setPriceBrutto(FormatTextFactory.getMoneyFormat().parse(txtPriceBrutto.getText()).doubleValue());

Автор: azz 5.4.2006, 16:00
Нет не все....
Перестал срабатывать getFocus....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)