2017-02-01 1 views
-1

그래서 몇개의 JTextFields를 가지고 놀고 있었는데, 나는 특수 문자를 포함하여 지연 시간에 타이핑 한 내용을 인쇄하려했습니다. ActionListener를 사용하기 위해 javax.swing.Timer를 사용했습니다.JTextField에서 반환 된 문자열이 특수한 문자를 인식하지 않는 이유는 무엇입니까?

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를 내 정확히 인쇄 끝납니다. picture of the code running 왼쪽 텍스트가 어떤 콘솔에 인쇄되고있다 (예를 들어, 대신 새로운 라인을 인쇄하는, 그냥 \ n을 인쇄합니다) 오른쪽은 'inputs'에 포함 된 JTextFields입니다.

JTextFields를 다룰 때 특별한 것을해야합니까?

+1

혼란 스럽습니다. 입력으로'\ n'을 (를) 입력하셨습니까? 왜 그게 새로운 라인을 출력할까요? 당신은'\ n'이 Java _source code_에서 나타내는 것과 혼동스러워합니다. –

답변

2

여기에는 특수 문자가 없습니다. 을 해당 특수 문자로 변환하는 것은 문자열 리터럴에서 발생한 경우 컴파일러입니다.

+1

더 짧고 좋습니다.1+ –

0

디버그 할 작은 테스트를 작성했는데 설명하는 내용을 볼 수 있습니다 (JTextField은 아니지만 Scanner에 있지만 증상은 비슷합니다). 두 가지 상황에서 결과가 일치하지 않는 것처럼 보이지만 자바가 처리하고 문자를 이스케이프하는 방식에 대해 조금 더 알 수 있습니다.

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>] 

, 우리는 자바 디버거를 보면, 탈출없이 처리 알고 우리를 인도 우리가 JDK의 소스 코드에있을 때 "가변"패널. 이 문자열의 아무 것도 변경되지 않으므로 기호가 이스케이프되지 않습니다. 우리가 Scanner로부터 입력을 읽을 때

그러나 (이 상황에서 둘 다 표준 System.in 스트림에서 사용자의 입력을 읽고 Scanner에서와 JTextField에서 읽기 있기 때문에, 매우 비슷하게 귀하의 경우와 가정, 그리고 생산 같은 "불일치") 문자열 "\ n"은

[\\, 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; 
    } 
} 

,이 같은 "N"아무것도 "로 연결되지 않습니다 \ n "이 (가) 감지되었으므로 새 줄 바꿈이 추가되지 않고 입력이있는 그대로 인쇄됩니다.

그것은 JDK는 너무 다른 캐릭터의 두 가지 소스를 취급 지금 왜 실제로 나를 호기심하게, 우리는 일부 특수 문자를 추가하면 내가 (코드에서 자바 String로 인쇄 할 때, 자바 컴파일러는 이미 제대로 탈출 볼 수 있다고 가정 String에서 컴파일을 통과하려면 제대로 이스케이프 처리해야합니다. 하지만 사용자 입력에 대해서는 시스템에서 "의미"를 확인하지 않고 그대로 이스케이프 처리하는 것이 더 중요합니다.

+0

'\ n '은 컴파일 타임에 이스케이프 시퀀스로 처리되며'실행 중 '이 아닙니다. 차이점은 단순히 문자열 리터럴의 이스케이프 시퀀스가 ​​컴파일러에 의해 처리되고 JVM 또는 JRE의 어떤 것도 이스케이프 시퀀스를 전혀 처리하지 않는다는 것입니다. 신비가 없다. – EJP

+0

감사. 새로운 것을 배우기 위해 내 무지를 보여줍니다. – FaithReaper

관련 문제