4

一連の命令(変数、条件、ジャンプなどを含む)を受け取り、それらを評価する宿題として、単純なコンパイラーを作成するように割り当てられました。これはすでに完了していますが、プログラムをもう少し…「光沢のある」ものにし、ユーザーの快適さのために、テキストファイルから命令をロードする機能を追加したいと思いました。しかし、JTextArea'sappend ()メソッドはまったく何もしないので、私を本当に好きではないようです。関連するコードは次のとおりです。

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 ();
    }
}

( Appleの公式推奨事項に見られるように、Macでは見栄えが良いため、SwingのJFileChooserの代わりにAwtのFileDialogを使用しています。)

このinputコードで使用されている変数は、JTextAreaインスタンスを指しています。面白いことに、ループSystem.out.println ()内の呼び出しのおかげでファイルの内容が標準出力に書き込まれているのを見ることができるので、ファイル読み取り部分は問題なく機能している必要があります。whileただし、には何も表示されませんJTextArea。ここでStackOverflowで見つけた既存のソリューションをすべて試しました。これには、メソッドとメソッドの呼び出しが含まrepaint ()revalidate ()ますupdateUI ()

私は何が欠けていますか?

4

1 に答える 1

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のソリューションを使用することをお勧めします。

于 2012-10-21T10:16:27.497 に答える