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


Автор: Swatch 31.8.2007, 06:08
Добрый день.

Помогите, кто чем может, пожалуйста. 
Поставили следующую задачу: а поля, куда должны вводиться денежки, чтобы ввод осуществлялся по формату  #,###, где "," - это разделитель тысяч. 

Нашла jFormattedTextField, но не могу разобраться, что надо сделать. Написала вот так:

Код

        MaskFormatter mf = null;
        try {
            mf = new MaskFormatter("#,###");
        } catch (ParseException ex) {
        }
        mf.setPlaceholderCharacter('#');
        mf.install(jFormattedTextField1);


Но теперь больше 9тысяч 999 рублей ввести нельзя. И если, например, я введу всего одну цифру, то она будет рассматриваться как тысяча?

Добавлено через 2 минуты и 15 секунд
И еще. Значения из полей мне надо записывать в базу. Но значения в базе типа Double и ничего не сохраняется.:( Как то можно получить значение без маски? И что вообще делать в этом случае?

Автор: eXcile 31.8.2007, 07:04
можно использовать NumberFormatter
Код

                    NumberFormat number = new DecimalFormat("#,###");    
            number.setMaximumIntegerDigits(6);                 // максимальное количество циферок
            
            numberField = new JFormattedTextField(new NumberFormatter(number));    
            numberField.setColumns(7);
            numberField.setValue(new Integer(123456));     
            
            Integer i = (Integer)numberField.getValue();
            System.out.println(i);

Автор: Swatch 31.8.2007, 08:13
Хммм... почему-то не работает... то есть текст филд вообще пустой... и если туда вводить цифры, то никаких запятых там не расставляется...
и что еще делает вот эта строка : numberField.setColumns(7); ?

Автор: eXcile 31.8.2007, 08:25
Цитата(Swatch @  31.8.2007,  08:13 Найти цитируемый пост)
и если туда вводить цифры, то никаких запятых там не расставляется...

разделителем является не запятэ, а пробел. фишка в том, что значение отформатируется при смене фокуса


Цитата(Swatch @  31.8.2007,  08:13 Найти цитируемый пост)
и что еще делает вот эта строка : numberField.setColumns(7); ?

определяет длину поля, в количестве символов

Автор: Swatch 31.8.2007, 08:42
а можно делать разделителем все-таки запятую? если можно, то как?

Автор: dorogoyIV 31.8.2007, 10:46
Цитата(Swatch @  31.8.2007,  08:42 Найти цитируемый пост)
а можно делать разделителем все-таки запятую? если можно, то как?


replace(" ",",");  smile 

Автор: eXcile 31.8.2007, 11:37
Цитата(Swatch @  31.8.2007,  08:42 Найти цитируемый пост)
а можно делать разделителем все-таки запятую? если можно, то как?

вот так:
Код

DecimalFormatSymbols dfs = new DecimalFormatSymbols();
            dfs.setGroupingSeparator(',');
            DecimalFormat number = new DecimalFormat("#,###",dfs);    
            number.setMaximumIntegerDigits(6);                 // максимальное количество циферок
            numberField = new JFormattedTextField(new NumberFormatter(number));    
            numberField.setColumns(15);
            numberField.setValue(new Integer(123456));     
            
            Integer i = (Integer)numberField.getValue();
            System.out.println(i);

Автор: Swatch 31.8.2007, 12:48
Не помогает. Написано так:

Код

        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
        dfs.setGroupingSeparator(',');
        DecimalFormat number = new DecimalFormat("#,###", dfs);  
        number.setMaximumIntegerDigits(6);  // максимальное количество циферок
            
        jFormattedTextField1 = new JFormattedTextField(new NumberFormatter(number));   


Все равно ничего не делает.... Ввожу цифры и, даже при потере фокуса, ничего не происходит... 
Может быть дело в том, что я пишу в NetBeans и часть кода там генерится сама.

Вот, что генерит NetBeans 
Код

        jFormattedTextField1 = new javax.swing.JFormattedTextField();
...
        jFormattedTextField1.setColumns(15);
        jFormattedTextField1.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jFormattedTextField1FocusGained(evt);
            }
        });


все это написано в initComponents(); а потом, в методе, где initComponents() вызывается, после я пишу тот код, который привела сначала. Но ничего не происходит smile 

Автор: eXcile 31.8.2007, 13:10
а если твой код вставить в initComponents()? т.е. подредактировать там, где 
Цитата(Swatch @  31.8.2007,  12:48 Найти цитируемый пост)
в NetBeans и часть кода там генерится сама


Автор: Swatch 31.8.2007, 13:15
а там нельзя редактировать... даже если это отредактировать откуда-нить, то это может потом вызвать ошибки и потом вообще все упадет... пройденный этап уже...

Автор: eXcile 31.8.2007, 13:24
приведи код этого класса

Автор: Swatch 31.8.2007, 13:30
Код

public class DisposalCostPanel extends javax.swing.JPanel implements IPanelSave{
    
/** Creates new form DisposalCostPanel */
    public DisposalCostPanel() {
        initComponents();// вот здесь то и создаются все компоненты
                
        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
        dfs.setGroupingSeparator(',');
        DecimalFormat number = new DecimalFormat("#,###", dfs);  
        number.setMaximumIntegerDigits(6);  // максимальное количество циферок
            
        jFormattedTextField1 = new JFormattedTextField(new NumberFormatter(number)); 

Автор: eXcile 31.8.2007, 13:39
если я правильно думаю, то у тебя создается всего один текстфилд, это тот который описан в initComponents, а текстфилда из DisposalCostPanel() вообще нет. Вся соль в том, чтобы втексте присутствовала запятая, а это происходит из-за указания форматированного текста DecimalFormat. может есть какие-нибудь ссылки на компоненты? и надо через них работать? с NetBeans не работал, поэтому объективно объяснить не могу...

Автор: Swatch 31.8.2007, 15:57
Сделала вот так:

Код

DecimalFormatSymbols dfs = new DecimalFormatSymbols();
        dfs.setGroupingSeparator(',');
        AbstractFormatter displayFormatter = new NumberFormatter(new DecimalFormat("#,###", dfs));
    ((NumberFormatter)displayFormatter).setValueClass(Double.class);
        AbstractFormatter editFormatter = new NumberFormatter(new DecimalFormat("#,###"));
    ((NumberFormatter)editFormatter).setValueClass(Double.class);
        

        
        jFormattedTextField1.setFormatterFactory(new DefaultFormatterFactory(displayFormatter,displayFormatter,editFormatter));


Возникла другая проблема. Мне надо, чтобы при потере фокуса у компонента jFormattedTextField1 пересчитывалась сумма одна. Для этого надо брать значение jFormattedTextField1. Но значение обновляется только после потери фокуса, то есть на само событие значение jFormattedTextField1 остается то, которое было до ввода. 
Есть ли какая-нибудь функция, которая позволит обновить значение jFormattedTextField1 во время потери фокуса?

Автор: fixxer 31.8.2007, 17:19
Нужно вешать листенер не на потерю фокуса, а на изменение значения.
Код

jFormattedTextField1.addPropertyChangeListener("value", ...)

Автор: SergikXP 31.8.2007, 21:26
Там есть закладка code в инспекторе свойств.
Где есть строка Precreate code - точно не помню (под рукой его нет), где можно ввести код или вызвать функцию в момент создания.

Автор: eXcile 3.9.2007, 05:14
Цитата(Swatch @ 31.8.2007,  13:30)
Код

public class DisposalCostPanel extends javax.swing.JPanel implements IPanelSave{
    
/** Creates new form DisposalCostPanel */
    public DisposalCostPanel() {
        initComponents();// вот здесь то и создаются все компоненты
                
        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
        dfs.setGroupingSeparator(',');
        DecimalFormat number = new DecimalFormat("#,###", dfs);  
        number.setMaximumIntegerDigits(6);  // максимальное количество циферок
            
        jFormattedTextField1 = new JFormattedTextField(new NumberFormatter(number)); 

в этом коде я не вижу добавление компонента на панель [add(jFormattedTextField1)]...
хотя может NetBeans, сам каким-то образом это делает

Автор: Swatch 3.9.2007, 08:57
Спасибо большое. ТОлько теперь возникли 2 других проблемы. 
1.Если я пытаюсь просто убрать значение из jFormattedTextField, то при потере фокуса значение в  jFormattedTextField становится равным предыдущему значению. 
2. Если я редактирую текст в  jFormattedTextField и потом нажимаю на кнопку переходи между формами, то значение не сохраняется. То есть раньше, когда стояло событие потери фокуса, фокус терялся и редактирование останавливалось на том, что ввела... А теперь вообще ничего не происходит... То есть, при нажатии на кнопку значение в  jFormattedTextField становится равным предыдущему значению.:( 

Что делать, подскажите, пожалуйста... smile 

Автор: Swatch 3.9.2007, 10:10
Добрый день.

Спасибо большо, PropertyChangeListener помог. Только теперь возникло 2 другие проблемы:

1. При попытке стереть данные из jFormattedTextField, если там до этого что-то было введено, стирание не происходит... то есть я выделяю данные, которые были, удаляю их и, если jFormattedTextField теряет фокус, то там остается не пустой jFormattedTextField, как должно быть по идее, а данные, которые я пыталась стереть.

2. Если я редактирую данные в jFormattedTextField и при редактировании нажимаю кнопку, по которой должен осуществляться переход между панелями, то данные в jFormattedTextField, которые я вводила, не сохраняются, а, опять таки, замещаются значениями, которые были до этого. То есть если фокус у jFormattedTextField теряется, но мы остаемся на этой же панеле, то значение сохраняется, а если уходим с панели, то значение берется то, которое было jFormattedTextField.

Добавлено через 1 минуту и 29 секунд
ой, 2 раза написала... smile

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