Swing: почему JFormattedTextField добавляет «,» на потерянном фокусе - PullRequest
1 голос
/ 15 июля 2011

вопрос в названии.

Я отображаю целое число в моем текстовом поле, но оно продолжает добавлять «,», когда я покидаю поле ... есть идеи, почему?

для любителей кода:

вызовы onfocuslost:

if(textStiffness != null){
            String s1 = textStiffness.getText();
            if(s1 != null){
                stiffness = Float.valueOf(s1.replaceAll(",", "")).intValue();
                stiffness = Math.max(0, stiffness);
            }
        }

тогда:

if(textStiffness != null){
            textStiffness.setText((""+(int)stiffness).replaceAll(",", ""));

        }

Я проверил набор текста в поле и его правильное значение 10000, но затем его изменили на 10 000, и я не понимаю, почему

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

Вы все еще не показываете нам NumberFormat, который использует JFormattedTextField, и это на самом деле критическая информация, необходимая для решения вашей проблемы.Я могу только предположить, что вы используете NumberFormat.getNumberInstance() для средства форматирования, и если это так, если вы проверите API для этого класса, вы увидите, что для этого объекта свойству groupingUsed по умолчанию установлено значение true.Вы хотите установить значение false, чтобы избавиться от запятых.

Например, вот мой SSCCE , который показывает вашу проблему и ее решение:

import java.awt.BorderLayout;
import java.text.NumberFormat;

import javax.swing.*;

public class FormattedFieldFun {
   private static void createAndShowUI() {
      NumberFormat numberFormatGuFalse = NumberFormat.getNumberInstance();
      numberFormatGuFalse.setGroupingUsed(false);  // ***** HERE *****
      JFormattedTextField jftFieldGuFalse = 
          new JFormattedTextField(numberFormatGuFalse);

      NumberFormat numberFormatGuTrue = NumberFormat.getNumberInstance();
      // numberFormatGuFalse.setGroupingUsed(true); // not necessary as is default
      JFormattedTextField jftFieldGuTrue = 
          new JFormattedTextField(numberFormatGuTrue);

      JPanel panel = new JPanel(new BorderLayout());
      panel.add(jftFieldGuFalse, BorderLayout.NORTH);
      panel.add(jftFieldGuTrue, BorderLayout.SOUTH);

      JFrame frame = new JFrame("FormattedFieldFun");
      frame.getContentPane().add(panel);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}
1 голос
/ 15 июля 2011

Чтение Документы , я нашел несколько наблюдений:

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

Обратите внимание, что хотя класс JFormattedTextField наследует метод setText от класса JTextField, вы обычно не вызываете метод setText в поле форматированного текста. Если вы это сделаете, отображение поля изменяется соответствующим образом, но значение не обновляется (если только средство форматирования поля не обновляет его постоянно).

, а также setFocusLostBehavior(int):

Определяет результат поля, потерявшего фокус. Возможные значения определены в JFormattedTextField как COMMIT_OR_REVERT (по умолчанию), COMMIT (зафиксировать, если он действителен, в противном случае оставить все то же самое), PERSIST (ничего не делать) и REVERT (изменить текст, чтобы отразить значение).

...