Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';JTextField返回的字符串不能识别特殊字符吗?_Java_Jtextfield - Fatal编程技术网

Java 为什么';JTextField返回的字符串不能识别特殊字符吗?

Java 为什么';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

所以我只是在摆弄一些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
}
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;
    }
}