所以我只是搞乱了一些JTextFields,试图在延迟时打印我输入的内容,包括特殊字符。我使用了javax.swing.Timer来使用ActionListener。
public void actionPerformed(ActionEvent arg0) {
// inputs is an array of 10 JTextFields
for(int i = 0 ; i < inputs.length;i++)
{
System.out.println(inputs[i].getText().toString());
}
System.out.println("\n\n"); // space between each print to the console
}
但是控制台最终会打印JTextField中的内容。(例如,不是打印新行,而是打印\ n)左侧文本是打印到控制台的内容,右边是&#39;输入&#39;中包含的JTextField。
在处理JTextFields时你是否需要做一些特别的事情?
答案 0 :(得分:2)
这里没有特殊字符。如果编译器出现在字符串文字中,那么将将转义 转换为相应的特殊字符的Java中唯一的东西就是编译器。
答案 1 :(得分:0)
我写了一个小测试来调试,我看到你描述的内容(JTextField
中没有,但Scanner
中没有,但症状相似)。两种情况下的结果似乎不一致,但我们可以更多地了解Java处理和转义字符的机制。
package com.WindThunderStudio.PrintLine;
import java.util.Scanner;
public class Tester {
public static void main(String[] args) {
System.out.println("Line 1");
System.out.println("\n");
System.out.println("Line 2");
//output:
// Line 1
//
//
//
// Line 2
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
//output: "\n" for "\n", no line feed added.
}
}
一些调试让我们知道在执行
行时System.out.println("\n");
对String进行处理而不进行转义,例如
[<line_feed>]
,如果我们查看Java调试器&#34;变量&#34;我们在JDK的源代码中的面板。此字符串的任何内容都不会更改,因此不会转义任何符号。
然而,当我们从Scanner
读取输入时(在这种情况下,我认为它与您的情况非常相似,因为从Scanner
和JTextField
的阅读都在阅读来自标准System.in
流的用户输入,并产生相同的&#34;不一致&#34;),字符串&#34; \ n&#34;将被视为
[\\, n] // (the char '\' is escaped properly)
,并且不会检测到换行。更具体一点,我们在讨论java.io.PrintStream类中的方法write(String s)
:
private void write(String s) {
try {
synchronized (this) {
ensureOpen();
textOut.write(s);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush && (s.indexOf('\n') >= 0))
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
因为角色&#34; \&#34;自动转义,它不会与&#34; n&#34;没有像&#34; \ n&#34;检测到,因此不添加新的换行,输入按原样打印。
实际上,为什么JDK对这两个字符来源的处理方式有所不同,这让我很好奇,我认为当从代码中使用JavaString
进行打印时,Java编译器会看到已经正确转义(如果我们在String中添加一些特殊字符,我们必须正确地转义它们来传递编译,还记得吗?)。但是对于用户输入,因此按原样逃避它们更重要,而不是检查它的意思&#34;到系统。