【问题标题】:Java Hex FormatterJava 十六进制格式化程序
【发布时间】:2013-08-05 12:26:06
【问题描述】:

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

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

你知道解决问题的另一种方法吗?

【问题讨论】:

  • 您是否考虑过编写自己的格式化程序,使用DefaultFormatter 和您自己的DocumentFilter 或扩展AbstractFormatter
  • 我尝试了自己的 DocumentFilter,但无法编辑文档的孔文本/值/内容。我也尝试过覆盖 MaskFormatter,但找不到像“格式化文本”这样的方法来格式化孔值。

标签: java hex jtextfield formatter jformattedtextfield


【解决方案1】:

问题解决了。

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;
    }
}

【讨论】:

    猜你喜欢
    • 2017-11-11
    • 2013-01-21
    • 1970-01-01
    • 2023-04-09
    • 2010-09-22
    • 2013-10-23
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多