2013-12-14 4 views
4

мне нужно сделать JFormattedTextField следующий формат «00:00» с некоторыми требованиями:JFormattedTextField специальный формат

  • только изменчива должен быть либо «00». (So ​​":" не следует удалять)
  • Вкладка позволяет вам переключаться между двумя сторонами «:». (Таким образом, имея курсор на одной стороне и знаки табуляции как «00» с другой стороны)
  • Изменение «00» на «2» должно отформатировать его до «02».
  • Это ограничение персонажа должно быть 5, включая «:». (4 сменных символа)
  • Он должен быть инициализирован как «00:00», но это не должно быть приемлемым вводом.
  • Вы не сможете ввести ничего, кроме цифр. (Письма, символы, отрицательные числа и т. Д.)

Есть ли способ сделать это? Я посмотрел на различные форматирующие элементы, валидаторы и фильтр документов, чтобы добавить в JFormattedTextField, но я не уверен, с кем идти. (Использование DefaultFormatter прямо сейчас, но посмотрел на NumberFormatter для ограничения. Мне нужно использовать комбинацию форматировщиков и валидаторов?)

Это мой JFormattedTextField прямо сейчас: http://pastebin.com/jW2RSJXe [1].

Любое из кода, которое делает это с примерами/указателями на то, что посмотреть будет оценено!

+1

Я не думаю, что часть 2 была бы достижима. Вы можете взглянуть на [это поле времени] (http://stackoverflow.com/questions/11881301/best-way-to-constrain-user-to-enter-a-time-in-a-jtextfield/11881681# 11881681), который немного обманывает и использует два текстовых поля – MadProgrammer

ответ

2

Запустить этот пример. Он использует MaskFormatter. : там постоянно, но я не уверен, как отформатировать другой части вашего вопроса, где, если у вас есть только 2, она будет показывать 02. Вы можете поиграть с ним

import java.awt.BorderLayout; 
import javax.swing.JFormattedTextField; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.text.MaskFormatter; 

public class MaskFormatterTest extends JPanel { 

    private JFormattedTextField formatText; 

    public MaskFormatterTest() { 
     formatText = new JFormattedTextField(createFormatter("##:##")); 
     formatText.setColumns(20); 
     formatText.setText("00:00"); 

     setLayout(new BorderLayout()); 
     add(new JLabel("Enter only numbers"), BorderLayout.NORTH); 
     add(formatText, BorderLayout.CENTER); 
    } 

    private MaskFormatter createFormatter(String s) { 
     MaskFormatter formatter = null; 
     try { 
      formatter = new MaskFormatter(s); 
     } catch (java.text.ParseException exc) { 
      System.err.println("formatter is bad: " + exc.getMessage()); 
      System.exit(-1); 
     } 
     return formatter; 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame("MaskFormatter example"); 
       frame.add(new MaskFormatterTest()); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLocationByPlatform(true); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

MaskFormatter The наборы значение типа для каждого символа в каждой позиции и разрешенный размер. В этом случае я использовал ##:##. Разрешить две цифры, двоеточие и еще две цифры.

Обновление: Добавлен formatText.setText("00:00"); в код для инициализации текстового поля.

+0

Спасибо! Это меня очень близко к тому, что я ищу! У вас есть хорошее место, чтобы прочитать о MaskFormatter или Formatter в целом? – user3101783

+0

Ознакомьтесь с [учебником] (http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html#maskformatter) и [javadoc] (http://docs.oracle.com/javase/ 7/документы/апи/javax/качели/текст/MaskFormatter.html). –

Смежные вопросы