Java十六进制格式化程序
我需要一个JTextField来插入十六进制字节。示例:“05 DE DD A9 4D 00 0C 5E” 我试过使用掩码“HH HH HH”的JFormattedTextField+MaskFormatter,但这是一个固定掩码。 我需要一个,可以“填满” 我也尝试过DocumentFilter,但这不允许我编辑完整的文本。只有插入的块被“过滤” 你知道解决这个问题的其他方法吗?问题解决了Java十六进制格式化程序,java,hex,jtextfield,formatter,jformattedtextfield,Java,Hex,Jtextfield,Formatter,Jformattedtextfield,我需要一个JTextField来插入十六进制字节。示例:“05 DE DD A9 4D 00 0C 5E” 我试过使用掩码“HH HH HH”的JFormattedTextField+MaskFormatter,但这是一个固定掩码。 我需要一个,可以“填满” 我也尝试过DocumentFilter,但这不允许我编辑完整的文本。只有插入的块被“过滤” 你知道解决这个问题的其他方法吗?问题解决了 import java.awt.EventQueue; import java.awt.Toolkit;
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("0123456789ABCDEF".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;
}
}
导入java.awt.EventQueue;
导入java.awt.Toolkit;
导入javax.xml.bind.DatatypeConverter;
导入javax.swing.*;
导入javax.swing.event.DocumentEvent;
导入javax.swing.event.DocumentListener;
公共类HexTextField扩展JTextField实现DocumentListener
{
私有静态最终长serialVersionUID=-6694532039668603522L;
私有布尔过滤=假;
公共HexTextField()
{
超级();
getDocument().addDocumentListener(此);
}
@凌驾
公共作废更改日期(记录事件e)
{
filterText();
}
@凌驾
公共作废插入更新(文档事件e)
{
filterText();
}
@凌驾
公共作废移除更新(文档事件e)
{
filterText();
}
私有void filterText()
{
如果(过滤)
返回;
过滤=真;
invokeLater(新的Runnable()
{
@凌驾
公开募捐
{
字符串输入=getText().toUpperCase();
字符串过滤=”;
int指数=0;
//滤器
对于(int i=0;i=0)//仅十六进制
{
过滤+=c;
如果(索引+++%2==1&&i!=input.length()-1)
筛选+=“”;//每个字节后的空格
}
}
//极限尺寸
int maxBytes=256;
if(过滤的.length()>3*maxBytes)
{
filtered=filtered.substring(0,3*maxBytes);
getDefaultToolkit().beep();
}
setText(过滤);
过滤=假;
}
});
}
公共字节[]getBytes()
{
字符串text=getText().replace(“,”);
如果(text.length()==0)
返回null;
if(text.length()%2==1)
text=text.substring(0,text.length()-1)+“0”+text.charAt(text.length()-1);
byte[]bytes=DatatypeConverter.parseHexBinary(文本);
if(bytes.length==0)
返回null;
返回字节;
}
}
您是否考虑过编写自己的格式化程序,或者将DefaultFormatter
与自己的DocumentFilter
一起使用,或者扩展AbstractFormatter
?我尝试过自己的DocumentFilter,但无法编辑文档的文本/值/内容。我还尝试重写MaskFormatter,但找不到像“格式化文本”这样的方法来格式化孔值。