J'ai écrit un petit test pour déboguer, et je vois ce que vous décrivez (non dans JTextField
, mais dans Scanner
, mais le symptôme est similaire). Le résultat dans deux situations semble incohérent, mais nous pouvons en savoir un peu plus sur le mécanisme de traitement et d'échappement des caractères 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.
}
}
Certains débogage nous amène à savoir que lors de l'exécution de la ligne de
System.out.println("\n");
la chaîne est traitée sans échapper, par exemple,
[<line_feed>]
, si l'on regarde dans le débogueur Java Panneau "Variable" lorsque nous sommes dans le code source de JDK. Rien de cette chaîne n'est changé, donc aucun symbole n'est échappé.
Cependant, quand on lit l'entrée du Scanner
, (dans cette situation, je suppose qu'il est très bien aussi bien avec votre cas, parce que la lecture de Scanner
et de JTextField
sont à la fois l'entrée utilisateur lecture du flux System.in
standard, et produire les même « incompatibilité »), la chaîne « \ n » seront traités comme
[\\, n] // (the char '\' is escaped properly)
, et aucun saut de ligne est détecté. Être plus concret, nous parlons de la méthode write(String s)
dans la classe java.io.PrintStream:
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;
}
}
Parce que le caractère « \ » est automatiquement échappé, il ne sera pas liée à « n » et rien comme " \ n "est détecté, donc aucun nouveau saut de ligne n'est ajouté et l'entrée est imprimée telle quelle.
Il me rend curieux fait maintenant pourquoi traiter JDK ces deux sources de caractères de façon différente, et je suppose que lors de l'impression avec un Java String
à partir du code, le compilateur Java voit déjà bien échappé (si l'on ajoute des caractères spéciaux dans une String, il faut leur échapper correctement pour passer la compilation, tu te souviens?). Mais pour l'entrée de l'utilisateur, il est donc plus important de leur échapper tel quel, de ne pas vérifier sa "signification" dans le système.
Je suis confus. Vous avez tapé '\ n' comme entrée? Pourquoi cela produirait-il une nouvelle ligne? Vous semblez être confondu avec ce que '\ n' représente dans Java _source code_. –