JavaFX の TextBox、TextFile などのコンポーネントに文字列を表示する必要があります。この文字列には、印刷不可能な制御文字 (つまり、ASCII < 32 のすべての文字) を含めることができます。println() によってコンソールに文字列を表示すると、制御文字を使用して同じ文字列をコピーして貼り付けることができるため、制御文字がスペース (ビューのみ) に置き換えられます。デフォルトでは、印刷できない文字は表示のためにスキップされます。Javaコンソールに配置されているように、JAvaFxのコンポーネントで特殊文字を表示/入力するために同じ結果を受け取りたいのですが、可能ですか??
質問する
1383 次
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 に設定できます。私はおそらく疑問符を使うでしょう。char
setReplacementChar
于 2013-04-06T04:12:32.767 に答える