2012-10-21 3 views
4

우리는 지시 사항 집합 (변수, 조건, 점프 등)을 취하여 평가하는 숙제로 간단한 컴파일러를 작성했습니다. 그건 이미 끝났지 만, 프로그램을 조금만 더 "빛나는"것이라고 생각하고, 사용자 편의를 위해서 텍스트 파일에서 명령어를로드하는 기능을 추가했습니다. 그러나, 그것은 정확히 아무것도하지 않는 것처럼 JTextAreaappend() 방법이 나를 정말로 좋아하는 것처럼 보이지 않는 것처럼 보입니다. 여기에 관련 코드입니다 : (. 단순히 맥에 잘 보이므로 내가 대신 스윙의 JFileChooser로의 AWT의의 FileDialog를 사용하고, Apple's official recommendation에서 볼 수 있듯이) JTextArea의 append() 메소드가 작동하지 않는 것 같습니다.

BufferedReader bufferedReader; 
File file; 
FileDialog fileDialog = new FileDialog (new Frame(), "Open File", FileDialog.LOAD); 
String line; 

fileDialog.setVisible (true); 

if (fileDialog.getFile() != null) { 
    file = new File (fileDialog.getDirectory() + fileDialog.getFile()); 
    input.setText (""); // delete old first 

    try { 
     bufferedReader = new BufferedReader (new FileReader (file)); 
     line = bufferedReader.readLine(); 

     while (line != null) { 
      input.append (line); 
      System.out.println (line); 
      line = bufferedReader.readLine(); 
     } 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

이 코드 포인트에 사용되는 input 변수는 JTextArea 인스턴스 재미있는 점은 - while 루프 내의 System.out.println() 호출 덕분에 파일 내용이 표준 출력에 기록되는 것을 볼 수 있기 때문에 파일 읽기 부분이 완벽하게 작동해야합니다. 그러나 JTextArea에는 아무 것도 나타나지 않고 StackOverflow에서 찾은 기존 솔루션을 모두 시도했습니다. 여기에는 repaint(), revalidate()updateUI() 메서드 호출이 포함됩니다.

무엇이 누락 되었습니까? 모든 답변 주셔서 대단히 감사합니다!

+6

[JTextComponent.read (Reader, Object)] (http://docs.oracle.com/javase/7/docs/api/javax/swing/text/JTextComponent.html#read%)를 사용하여 문제를 단계별로 조사하십시오. 28java.io.Reader, % 20java.lang.Object % 29). –

+0

* "Swing의 JFileChooser 대신에 Awt의 FileDialog를 사용하고 있습니다. Mac에서 더 좋아 보이기 때문입니다."* Windows 및 * nix에서는 무엇을하고 있습니까? Mac 만 타겟팅하는 경우 .. 코코아가 아닌 Java를 사용하거나 OS X 기본 GUI 툴킷 이름이 무엇이든간에 –

+2

* "우리는 숙제를 배정 받았다. 이미 끝났지 만 내 프로그램을 조금 더 만들 것이라고 생각했다."반짝 반짝 빛났다. "나는이 말을하기 전에 의미했지만 문제의 기술 측면에 산만 해졌다. . 숙제 인 경우 소스의 가독성 향상, 관련성있는 주석 추가 또는 코드를 증명하는 테스트 작성에 더 나은 시간을 보내는 것이 좋습니다. 빨간색 줄무늬와 금색 별이 끊어지는 코드가 비효율적이며 잘못 작성된 코드보다 눈에 잘 띄는 버그가없는 잘 작성된 코드를 제출하는 것이 좋습니다. :) –

답변

5

코드를 그리는 데 사용할 수없는 이벤트 처리 루프에서 코드가 호출됩니다. 하나는 일반적으로

final String line = bufferedReader.relineadLine(); 
// final+local var so usable in Runnable. 

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     input.append(line + "\n"); 
    } 
} 

불행하게도 그것 (루프 같은) invokeLatere을 배치 할 몇 가지를 돌봐 사용할 수 있습니다. @ AndrewThompson의 솔루션을 사용하는 것이 더 좋습니다.

관련 문제