1

JavaFX の TextBox、TextFile などのコンポーネントに文字列を表示する必要があります。この文字列には、印刷不可能な制御文字 (つまり、ASCII < 32 のすべての文字) を含めることができます。println() によってコンソールに文字列を表示すると、制御文字を使用して同じ文字列をコピーして貼り付けることができるため、制御文字がスペース (ビューのみ) に置き換えられます。デフォルトでは、印刷できない文字は表示のためにスキップされます。Javaコンソールに配置されているように、JAvaFxのコンポーネントで特殊文字を表示/入力するために同じ結果を受け取りたいのですが、可能ですか??

4

1 に答える 1

0

私が作成したこのコードを自由に使用および/または編集してください。

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**
 * A text field where all control characters are displayed as the same optional
 * char. The default replacement char is space.
 */
public class MyTextField extends JTextField {

    private static final long serialVersionUID = -4027593772585498003L;
    private static final Clipboard clipboard =
            Toolkit.getDefaultToolkit().getSystemClipboard();

    //String whose control characters aren't replaced
    private String ctrlText;
    //Char for replacing control characters
    private char replacementChar;

    public MyTextField() {
        this(null, 0);
    }
    public MyTextField(int columns) {
        this(null, columns);
    }
    public MyTextField(String text) {
        this(text, 0);
    }
    public MyTextField(String text, int columns) {
        ctrlText = (text == null) ? "" : text;
        setReplacementChar(' ');
        setDocument(new CustomDocument());
        setText(text);
        setColumns(columns);
    }
    /**
     * Sets the char to replace the control characters.
     * 
     * @param ch  the char to replace the control characters
     */
    public void setReplacementChar(char ch) {
        replacementChar = ch;
    }

    @Override
    public void cut() {
        int start = getSelectionStart();
        int end   = getSelectionEnd();

        //Copy to clipboard
        String data = ctrlText.substring(start, end);
        clipboard.setContents(new StringSelection(data), null);

        //Set new text
        String newText = ctrlText.substring(0, start) + ctrlText.substring(end);
        setText(newText);
    }
    @Override
    public void copy() {
        int start = getSelectionStart();
        int end   = getSelectionEnd();

        //Copy to clipboard
        String data = ctrlText.substring(start, end);
        clipboard.setContents(new StringSelection(data), null);
    }
    @Override
    public void paste() {
        int start = getSelectionStart();
        int end   = getSelectionEnd();

        //Get data from clipboard
        String data = null;
        try { data = (String)clipboard.getData(DataFlavor.stringFlavor); }
        catch (UnsupportedFlavorException e) {}
        catch (IOException e) {}

        //Set new text
        String newText = ctrlText.substring(0, start)
                + data
                + ctrlText.substring(end);
        setText(newText);
    }
    /**
     * Replaces all control characters with the replacement char.
     * 
     * @param text  the String whose control characters are to be replaced
     * @return      the resulting String
     */
    private String replaceCtrlChars(String text) {
        if(text == null) return null;

        return text.replaceAll("\\p{Cntrl}", "" + replacementChar);
    }
    /**
     * Document where control characters are displayed as the replacement char.
     */
    private class CustomDocument extends PlainDocument {
        @Override
        public void remove(int offs, int len) throws BadLocationException {
            //Remove from ctrlText
            ctrlText = ctrlText.substring(0, offs)
                    + ctrlText.substring(offs + len);
            //Remove from text field
            super.remove(offs, len);
        }
        @Override
        public void insertString(int offs, String str, AttributeSet a)
                throws BadLocationException {
            //Insert to ctrlText
            ctrlText = ctrlText.substring(0, offs)
                    + str
                    + ctrlText.substring(offs);
            //Insert String with replaced chars to text field
            super.insertString(offs, replaceCtrlChars(str), a);
        }
        private static final long serialVersionUID = -6187351778620427126L;
    }
}

これは、制御文字 (ASCII < 32 または == 127 の文字) が同じオプションとして表示されるテキスト フィールドですchar

デフォルトの置換はスペースですが、を呼び出しcharて任意の displayable に設定できます。私はおそらく疑問符を使うでしょう。charsetReplacementChar

于 2013-04-06T04:12:32.767 に答える