Java новичок: качать и отображать файлы ASCII - PullRequest
2 голосов
/ 25 февраля 2009

G'day all,

У меня есть приложение, которое должно отображать файл ASCII из 15 строк в компоненте Swing, который не может быть отредактирован пользователем.

Ниже приведен мой код, который читает файл ASCII побайтно. Я благодарю полезных комментаторов, которые объяснили, что JTextArea.setEditable (false) будет уместным в Swing.

Однако мой код просто отображает строку чисел, когда я лично сделал файл ASCII совершенно другим. Кто-нибудь знает, что я делаю неправильно и как заставить отображаться сами символы ASCII?

import java.io.*;
import javax.swing.*;

public class LoadMap extends JFrame {
    public LoadMap() throws IOException {
        FileInputStream fIn = new FileInputStream("map.srn");
        BufferedReader rd = new BufferedReader(new InputStreamReader(fIn, "US-ASCII"));
        String map = "";
        JTextArea mapArea = new JTextArea(15, 50);

        try {
            int c;
            while ((c = rd.read()) != -1) {
                map= map + c;
            }
        } finally {
            if (rd != null) {
                rd.close();
            }
        }
        mapArea.setText(map);
        mapArea.setEditable(false);
        add(mapArea);
        pack();
        setVisible(true);
    }
}

Ответы [ 7 ]

1 голос
/ 25 февраля 2009

JLabel не будет отображать разрывы строк (если вы не используете HTML). Поэтому, как написали другие, используйте текстовую область.

Однако есть еще одна скрытая проблема с вашим кодом: вы не указываете кодировку файла, что означает, что содержимое файла может быть искажено, если оно содержит символы не ASCII и его кодировка не соответствует платформе Java по умолчанию. Чтобы это исправить, не используйте FileReader. Вместо этого используйте FileInputStream и оберните его в InputStreamReader, указав кодировку в его конструкторе.

1 голос
/ 25 февраля 2009

Это заставляет меня чувствовать себя капитаном Очевидным, но все же: сначала загрузите весь текст, а , а затем создайте метку, используя нужный текст. Или, как справедливо предлагают другие авторы, используйте JTextArea, так как он больше подходит для многострочного контента.

1 голос
/ 25 февраля 2009

Вы можете создать строку внутри цикла, а затем положить строку в JLabel, когда закончите.

1 голос
/ 25 февраля 2009

Используйте JTextArea и вызовите setEditable (false).

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/text/JTextComponent.html#setEditable(boolean)

1 голос
/ 25 февраля 2009

Используйте JTextArea и позвоните

setEditable(false);

чтобы пользователь не мог редактировать данные

Я только что прочитал ваш код и понял, что это не достаточно исчерпывающий ответ. Вы не можете сделать «+» на этикетке. Что вам нужно сделать, это сначала прочитать текст и сохранить его где-нибудь, а затем позвонить

setText(yourTextAsString);

на вашем текстовом компоненте на экране (для которого я все еще использовал бы JTextArea), и вам нужно добавить текстовую область к фрейму, чтобы ваш код выглядел примерно так:

public LoadMap() {
     String data = // read your data
     JTextArea textArea = new JTextArea();
     textArea.setText(data);
     textArea.setEditable(false);
     setLayout(new GridLayout());
     add(textArea);
     pack();
     setVisible(true);
}

Я бы предложил прочитать учебник Swing , чтобы получить дополнительную информацию об использовании компонентов Swing

0 голосов
/ 28 февраля 2009

Здесь:

String map = "";
int c;
while ((c = rd.read()) != -1) {
    map= map + c;
}

Что вы делаете, добавляя int в строку.

Вместо этого вы должны привести их к персонажу.

int c;
while ((c = rd.read()) != -1) {
    map= map + ( char ) c;
}

Вы можете видеть намного лучшие образцы в этих вопросах.

Как создать строку Java из содержимого файла?

https://stackoverflow.com/questions/181634/simplest-efficient-ways-to-read-binary-and-ascii-files-to-string-or-similar-in-v/324792#324792 (см. Часть Java)

0 голосов
/ 25 февраля 2009

Вы можете использовать JTextArea и установить его только для чтения:

jtextarea.setEditable(false);
...