2013-08-04 7 views
0

16 진수 바이트를 삽입하려면 JTextField가 필요합니다. 예 : "05 DE DD A9 4D 00 0C 5E" 마스크 "HH HH HH"로 JFormattedTextField + MaskFormatter를 시도했지만이 마스크는 고정되어 있습니다. "채워질"수있는 하나가 필요합니다.자바 16 진수 포맷터

또한 DocumentFilter를 시도했지만 전체 텍스트를 편집 할 수 없습니다. 삽입 된 청크 만 "필터링"되었습니다.

문제를 해결하는 다른 방법을 알고 계십니까?

+1

자신 만의'DocumentFilter'로'DefaultFormatter'를 사용하거나'AbstractFormatter'을 확장하여 자신 만의 포맷터를 작성해 보셨습니까? – chrylis

+0

고유 한 DocumentFilter를 시도했지만 문서의 홀 텍스트/값/내용을 편집 할 수 없습니다. MaskFormatter를 재정의하려했지만 구멍 값의 서식을 지정하는 "서식 텍스트"와 같은 메서드를 찾을 수 없습니다. – user2651153

답변

0

문제가 해결되었습니다.

import java.awt.EventQueue; 
import java.awt.Toolkit; 

import javax.xml.bind.DatatypeConverter; 

import javax.swing.*; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 

public class HexTextField extends JTextField implements DocumentListener 
{ 
    private static final long serialVersionUID= -6694532039668603522L; 
    private boolean filtering= false; 

    public HexTextField() 
    { 
     super(); 
     getDocument().addDocumentListener(this); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent e) 
    { 
     filterText(); 
    } 

    @Override 
    public void insertUpdate(DocumentEvent e) 
    { 
     filterText(); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent e) 
    { 
     filterText(); 
    } 

    private void filterText() 
    { 
     if(filtering) 
      return; 
     filtering= true; 

     EventQueue.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       String input= getText().toUpperCase(); 
       String filtered= ""; 
       int index= 0; 

       // filter 
       for(int i= 0; i < input.length(); i++) 
       { 
        char c= input.charAt(i); 
        if("ABCDEF".indexOf(c) >= 0) // hex only 
        { 
         filtered+= c; 
         if(index++ % 2 == 1 && i != input.length() - 1) 
          filtered+= " "; // whitespace after each byte 
        } 
       } 

       // limit size 
       int maxBytes= 256; 
       if(filtered.length() > 3 * maxBytes) 
       { 
        filtered= filtered.substring(0, 3 * maxBytes); 
        Toolkit.getDefaultToolkit().beep(); 
       } 

       setText(filtered); 
       filtering= false; 
      } 
     }); 
    } 

    public byte[] getBytes() 
    { 
     String text= getText().replace(" ", ""); 
     if(text.length() == 0) 
      return null; 

     if(text.length() % 2 == 1) 
      text= text.substring(0, text.length()-1) + "0" + text.charAt(text.length()-1); 

     byte[] bytes= DatatypeConverter.parseHexBinary(text); 
     if(bytes.length == 0) 
      return null; 

     return bytes; 
    } 
}