Метод JTextArea append () не работает

Нам было поручено создать простой компилятор в качестве домашнего задания, которое будет принимать набор инструкций (содержащих переменные, условия, переходы и т. д.) и оценивать их. Это уже сделано, но я подумал, что сделаю свою программу немного более «блестящей» и добавлю возможность загружать инструкции из текстового файла, просто для удобства пользователя; однако, похоже, что 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 ();
    }
}

(я использую FileDialog от Awt вместо JFileChooser от Swing, потому что на Mac он выглядит лучше, как показано в официальная рекомендация Apple .)

Переменная input, используемая в этом коде, указывает на экземпляр JTextArea. Самое смешное, что часть для чтения файлов должна работать безупречно, так как я вижу, что содержимое файла записывается в стандартный вывод благодаря System.out.println ()

Чего мне не хватает? Большое спасибо за любой ответ!

4 голоса | спросил Cellane 21 +04002012-10-21T14:00:03+04:00312012bEurope/MoscowSun, 21 Oct 2012 14:00:03 +0400 2012, 14:00:03

1 ответ


0

Код, вероятно, вызывается в цикле обработки событий, где вы не можете рисовать. Один обычно использовал бы

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.

ответил Joop Eggen 21 +04002012-10-21T14:16:27+04:00312012bEurope/MoscowSun, 21 Oct 2012 14:16:27 +0400 2012, 14:16:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132