문제가 해결되었습니다.
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;
}
}
자신 만의'DocumentFilter'로'DefaultFormatter'를 사용하거나'AbstractFormatter'을 확장하여 자신 만의 포맷터를 작성해 보셨습니까? – chrylis
고유 한 DocumentFilter를 시도했지만 문서의 홀 텍스트/값/내용을 편집 할 수 없습니다. MaskFormatter를 재정의하려했지만 구멍 값의 서식을 지정하는 "서식 텍스트"와 같은 메서드를 찾을 수 없습니다. – user2651153