powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / DecimalFormat и JFormattedTextField
3 сообщений из 3, страница 1 из 1
DecimalFormat и JFormattedTextField
    #34913363
sommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хочу чтобы в textfield можно было вводить только цифпвы и по умолчанию всегда стояло в конце m/s, например

пытаюсь сделать так
Код: plaintext
JFormattedTextField jFormattedTextFieldCostValue =  new  JFormattedTextField( new  DecimalFormat("# m/s"));


позволяет вводить только цифры, "m/s" отсутствует, когда фокус переходит к другому элементу - все введеное вооще пропадает

как сделать правильно?
...
Рейтинг: 0 / 0
DecimalFormat и JFormattedTextField
    #34914615
MBasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если в тексте ВСЕГДА должно добавляться некоторое окончание, стоит ли беспокоится об этом в рамках формата? Сделайте это действием по умолчанию. Простота венчает оба конца шкалы изощренности (цитата из Гарри Гаррисона - я не особый его приверженец, но здесь он прав).
...
Рейтинг: 0 / 0
DecimalFormat и JFormattedTextField
    #34914719
Дуремар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы подошел к этой проблеме немного с другой стороны. Т.е. вообще бы не стал использовать JFormattedTextField. А использовал бы обычный JTextField.
Вот небольшой пример - JTextField, который позволяет вводить только числа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
 import  javax.swing.JTextField;
 import  javax.swing.text.*;

 public   class  IntegerEditTextField  extends  JTextField
{
   public  IntegerEditTextField()
  {
     super ();
  }

   public  Integer getValue()
  {
    Integer res =  null ;
     try 
    {
      res = Integer.valueOf( this .getText());
    }
     catch (NumberFormatException e)
    {
    }
     return  res;
  }

   public   void  setValue(Integer value)
  {
     this .setText(value ==  null  ? "" : value.toString());
  }

   protected  Document createDefaultModel()
  {
     return   new  IntegerTextDocument();
  }

   protected   class  IntegerTextDocument  extends  PlainDocument
  {
     public   void  insertString( int  offs, String str, AttributeSet a)  throws  BadLocationException
    {
      String insertStr = str.trim();
      String currentText = getText( 0 , getLength());
      String beforeOffset = currentText.substring( 0 , offs);
      String afterOffset = currentText.substring(offs, currentText.length());
      String proposedResult = beforeOffset + insertStr + afterOffset;

       if  (proposedResult.length() ==  0 )
         super .insertString(offs, insertStr, a);
       else 
      {
         try 
        {
          Integer.valueOf(proposedResult);
           super .insertString(offs, insertStr, a);
        }
         catch (NumberFormatException e)
        {
        }
      }
    }

     public   void  remove( int  offs,  int  len)  throws  BadLocationException
    {
      String currentText = getText( 0 , getLength());
      String beforeOffset = currentText.substring( 0 , offs);
      String afterOffset = currentText.substring(len + offs, currentText.length());
      String proposedResult = beforeOffset + afterOffset;

       if  (proposedResult.length() ==  0 )
         super .remove(offs, len);
       else 
      {
         try 
        {
          Integer.valueOf(proposedResult);
           super .remove(offs, len);
        }
         catch (NumberFormatException e)
        {
        }
      }
    }
  }
}
Как я добился такого эффекта? Я просто отнаследовался от модели данных для JTextField (внутренний класс IntegerTextDocument), переопределил методы insertString и remove. Соответственно у меня появилась возможность фильтровать ввод от пользователя ДО того, как он попадет в модель данных и будет отображен в JTextField.
Если этот класс немного доработать напильником, то можно решить и Вашу проблему. Во-первых при создании модели данных сразу добавляем в нее строку " m/s". Во-втрорых запрещаем любой ввод или удаление внутри части строки, где находится " m/s" и после нее (просто не вызываем методы super и все). В-третьих модифицируем алгоритм вычисления proposedResult так, чтобы в него не попадало символьное окончание " m/s".
Плюс такого подхода заключается в том, мы не завязаны на события получения/потери фокуса, что резко уменьшает количество глюков, и в любой момент времени мы имеем корректное значения внутри нашего текстового поля. Минус - приходится вручную реализовывать алгоритм фильтрации ввода.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / DecimalFormat и JFormattedTextField
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]