为什么从JTextField返回的字符串不识别特殊字符?

时间:2017-02-01 21:53:18

标签: 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.println(inputs[i].getText().toString());
    }
    System.out.println("\n\n"); // space between each print to the console
}

但是控制台最终会打印JTextField中的内容。(例如,不是打印新行,而是打印\ n)picture of the code running左侧文本是打印到控制台的内容,右边是&#39;输入&#39;中包含的JTextField。

在处理JTextFields时你是否需要做一些特别的事情?

2 个答案:

答案 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读取输入时(在这种情况下,我认为它与您的情况非常相似,因为从ScannerJTextField的阅读都在阅读来自标准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对这两个字符来源的处理方式有所不同,这让我很好奇,我认为当从代码中使用Java String进行打印时,Java编译器会看到已经正确转义(如果我们在String中添加一些特殊字符,我们必须正确地转义它们来传递编译,还记得吗?)。但是对于用户输入,因此按原样逃避它们更重要,而不是检查它的意思&#34;到系统。