2013-12-14 1 views
4
나는 몇 가지 요구 사항을 형식 "0시"다음 JFormattedTextField를 만들 필요가

:JFormattedTextField에 특정 형식

  • 유일한 변화는 "00"중 하나를해야합니다. (따라서 ":"는 삭제할 수 없습니다)
  • 탭을 사용하면 ":"의 양면을 변경할 수 있습니다. (따라서 한쪽에 커서가 있고 다른쪽에 "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을 사용합니다. : 영구적 있습니다,하지만 난 당신 만이있는 경우, 그것은 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 세트로 주위를 재생할 수있는 질문의 다른 부분을 포맷하는 방법을 잘 모르겠어요 각 위치에있는 각 문자의 유형 값과 허용되는 크기. 이 경우 ##:##을 사용했습니다. 두 자릿수, 콜론 및 두 자릿수를 허용합니다.

업데이트 : 텍스트 필드를 초기화하는 코드에 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/docs/api/javax/swing/text/MaskFormatter.html). –