如何在swings中的字符串中存储动态类型的文本

时间:2012-11-07 14:15:06

标签: java string swing bytearray keyboard-events

我正在尝试开发一个十六进制编辑器,其中编辑器面板提供了键侦听器,并且通过键盘输入转换为相应的输入。然而问题是关于保存转换的输入。现在只转换一个关键笔划值。我想在字符串中将这个转换后的input()用作束,并将其用于其他目的。我试图将转换后的文本保存在一个字节数组中,但它返回的是我键入的第一个值,而不管后面的输入是什么。

package gui.hex;

import javax.swing.*;

import cryptool.Test;

import java.awt.*;
import java.awt.event.*;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;

public class JHexEditorASCII extends JComponent implements MouseListener,
        KeyListener {

    private static final long serialVersionUID = 5636121664420538046L;
    private JHexEditor he;
    private static CharsetEncoder encoder = Charset.forName("UTF-8")
            .newEncoder();
    public static String modifiedText;
    public static byte temp[];

    public static byte[] getTemp() {
        return temp;
    }

    public void setTemp(byte[] temp) {
        this.temp = temp;
    }

    protected JHexEditorASCII(JHexEditor he) {
        this.he = he;
        addMouseListener(this);
        addKeyListener(this);
        addFocusListener(he);
    }

    public Dimension getPreferredSize() {
        debug("getPreferredSize()");
        return getMinimumSize();
    }

    public Dimension getMinimumSize() {
        debug("getMinimumSize()");

        Dimension d = new Dimension();
        FontMetrics fn = getFontMetrics(JHexEditor.font);
        int h = fn.getHeight();
        int nl = he.getLines();
        d.setSize((fn.stringWidth(" ") + 1) * (16) + (he.border * 2) + 1, h
                * nl + (he.border * 2) + 1);
        return d;
    }

    public void paint(Graphics g) {
        debug("paint(" + g + ")");
        debug("cursor=" + he.cursor + " buff.length=" + he.buff.length);
        Dimension d = getMinimumSize();

        // sets the color to the background.
        g.setColor(Color.orange);
        g.fillRect(0, 0, d.width, d.height);
        g.setColor(Color.black);

        g.setFont(JHexEditor.font);

        // ascii data
        int ini = he.getInitial() * 16;
        int fin = ini + (he.getLines() * 16);
        if (fin > he.buff.length)
            fin = he.buff.length;

        int x = 0;
        int y = 0;
        for (int n = ini; n < fin; n++) {
            if (n == he.cursor) {

                // sets color for the focus cursor it used to be in blue color.
                g.setColor(Color.red);
                if (hasFocus())
                    he.background(g, x, y, 1);
                else
                    he.table(g, x, y, 1);
                if (hasFocus())
                    g.setColor(Color.white);
                else
                    g.setColor(Color.black);
            } else {
                g.setColor(Color.black);
            }

            // builds a character object
            String s;

            if (encoder.isLegalReplacement(new byte[] { he.buff[n] }))
                s = "" + new Character((char) he.buff[n]);
            else
                s = ".";

            // compares the input supplied
            // if ((he.buff[n] < 20) || (he.buff[n] > 126))

            // converts the input entered into string
            // s = ".";
            // displaying of the text goes here.

            // displays the input

            System.out.println("the typed in string is:" + s);

            temp = s.getBytes();
            setTemp(temp);

            setModifiedText(s);

            he.printString(g, s, (x++), y);

            if (x == 16) {
                x = 0;
                y++;
            }
        }

    }

    private void debug(String s) {
        if (he.DEBUG)
            System.out.println("JHexEditorASCII ==> " + s);
    }

    public void dispaly(Graphics g) {
        int x = 0;
        int y = 0;

        he.printString(g, Test.getK(), (x++), y);
        if (x == 16) {
            x = 0;
            y++;
        }
    }

    // calculate the position of the mouse
    public int calculateMousePosition(int x, int y) {
        FontMetrics fn = getFontMetrics(JHexEditor.font);
        x = x / (fn.stringWidth(" ") + 1);
        y = y / fn.getHeight();
        debug("x=" + x + " ,y=" + y);
        return x + ((y + he.getInitial()) * 16);
    }

    // mouselistener
    public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) {
            // double clicked
            he.setNewTextListener.actionPerformed(new ActionEvent(this, 0,
                    "NEWASCII"));
        }

        debug("mouseClicked(" + e + ")");
        he.cursor = calculateMousePosition(e.getX(), e.getY());
        this.requestFocus();
        he.repaint();
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    // KeyListener
    public void keyTyped(KeyEvent e) {
        debug("keyTyped(" + e + ")");

        // only add content, if buffer is large enough
        if (he.buff.length > he.cursor) {
            he.buff[he.cursor] = (byte) e.getKeyChar();

            if (he.cursor != (he.buff.length - 1))
                he.cursor++;
            // change this
            // System.out.println( he.buff.toString());

            he.repaint();
        }
    }

    public void keyPressed(KeyEvent e) {
        debug("keyPressed(" + e + ")");
        he.keyPressed(e);
    }

    public void keyReleased(KeyEvent e) {
        debug("keyReleased(" + e + ")");
    }

    public boolean isFocusTraversable() {
        return true;
    }

    public static String getModifiedText() {
        return modifiedText;
    }

    public void setModifiedText(String modifiedText) {
        this.modifiedText = modifiedText;
    }
}

1 个答案:

答案 0 :(得分:1)

  • 开发十六进制编辑器(encoder.isLegalReplacement...

  • JTextFieldDocumentFilter一起使用,或使用JFormatterTextField paint()

    <最简单的JComponent代替油漆字符/ LI>
  • 使用paintComponent(而非paint())代表Swing JComponents

  • DocumentListener添加到JTextField with DocumentFilterJFormatterTextField

  • 有趣的方法是建立/准备/创建ArrayList of hex ()并使用AutoComplete JTextField