Java 为什么';JTextField返回的字符串不能识别特殊字符吗?
所以我只是在摆弄一些JTextFields,试图延迟打印我在其中输入的内容,包括特殊字符。我使用javax.swing.Timer来使用ActionListenerJava 为什么';JTextField返回的字符串不能识别特殊字符吗?,java,jtextfield,Java,Jtextfield,所以我只是在摆弄一些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.prin
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
}
public void actionPerformed(ActionEvent arg0){
//输入是由10个JTextFields组成的数组
for(int i=0;i
但控制台最终会打印出JTextField中的内容。(例如,它不打印新行,而是打印\n)左侧文本是打印到控制台的内容,右侧是“inputs”中包含的JTextFields
处理JTextFields时是否需要做一些特殊的操作?这里没有特殊字符。Java中唯一能将转义序列转换为相应特殊字符的是编译器,如果它们以字符串形式出现。我编写了一个小测试进行调试,我看到了您所描述的内容(在
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");
处理字符串时不会转义,例如
[<line_feed>]
,并且不会检测到线路馈送。更具体地说,我们正在讨论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;
}
}
由于字符“\”是自动转义的,因此它不会与“n”链接,也不会检测到类似“\n”的内容,因此不会添加新换行符,输入将按原样打印
现在我很好奇,为什么JDK对这两个字符源的处理如此不同,我假设当使用Java
字符串从代码中打印时,Java编译器看到它已经正确地转义了(如果我们在字符串中添加一些特殊字符,我们必须正确地转义它们才能通过编译,记得吗?). 但是对于用户输入来说,更重要的是按原样避开它们,而不是检查它对系统的“意义”。我很困惑。您输入了\n
?为什么会产生新的生产线?您似乎对Java源代码中的\n
表示的内容感到困惑。越短越好。1+\n
在编译时处理转义序列,而不是“执行时”。不同之处在于,字符串文本中的转义序列由编译器处理,而JVM或JRE中根本没有处理转义序列。不神秘,谢谢。为了学习新东西而表现出我的无知。
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;
}
}