Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java十六进制格式化程序_Java_Hex_Jtextfield_Formatter_Jformattedtextfield - Fatal编程技术网

Java十六进制格式化程序

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;

我需要一个JTextField来插入十六进制字节。示例:“05 DE DD A9 4D 00 0C 5E” 我试过使用掩码“HH HH HH”的JFormattedTextField+MaskFormatter,但这是一个固定掩码。 我需要一个,可以“填满”

我也尝试过DocumentFilter,但这不允许我编辑完整的文本。只有插入的块被“过滤”

你知道解决这个问题的其他方法吗?

问题解决了

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,但找不到像“格式化文本”这样的方法来格式化孔值。