1

私は、エディターのパネルにキーリスナーが提供され、キーボードからの入力が対応する入力に変換される16進エディターを開発しようとしています。ただし、問題は、隠蔽された入力の保存に関するものです。現在のところ、一度に1つのキーストローク値のみが変換されます。この変換された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;
    }
}
4

1 に答える 1

1
  • 16進エディタを開発する(encoder.isLegalReplacement...

  • で使用JTextFieldするか、またはを使用して文字をペイントする代わりにDocumentFilter最も簡単な方法を使用できますJFormatterTextFieldpaint()JComponent

  • paintComponent(の代わりにpaint())を使用するSwing JComponents

  • またはDocumentListenerに追加JTextField with DocumentFilterJFormatterTextField

  • 興味深い方法は、構築/準備/作成しArrayList of hex ()て使用することですAutoComplete JTextField

于 2012-11-07T14:50:29.053 に答える