2009-02-25 1 views
2

G'Day все,Java новичок: распашные и отображение ASCII файлы

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

Ниже приведен мой код, который читает байтовый файл 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); 
    } 
} 

ответ

0

Здесь:

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

Что вы делаете это добавление Int, чтобы строки.

Вы должны направить их вместо char.

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

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

How do I create a Java string from the contents of a file?

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

1

Используйте 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 tutorial, чтобы получить более подробную информацию об использовании компонентов Swing,

+0

Вы меня бить по 10 секунд с практически теми же словами! – JeeBee

+0

Большое спасибо. – elwynn

1

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

1

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

0

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

jtextarea.setEditable(false); 
1

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

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

+0

Спасибо, Майкл, это полезно знать. – elwynn