G'day all,
我有一个应用程序需要在Swing组件中显示15行的ASCII文件,用户无法编辑。
下面是我的代码,它逐字节地读取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 :(得分: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组件的更多信息
答案 1 :(得分:1)
使用JTextArea并调用setEditable(false)。
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/text/JTextComponent.html#setEditable(boolean)
答案 2 :(得分:1)
你可以在循环中构造一个String,然后在完成后将字符串放入JLabel。
答案 3 :(得分:1)
这让我感觉像是Captain Obvious,但仍然是:首先加载整个文本,然后使用所需的文本构建标签。或者,正如其他海报正确建议的那样,使用JTextArea,因为它更适合多行内容。
答案 4 :(得分:1)
JLabel不会显示换行符(除非您使用HTML)。正如其他人写的那样,使用文本区域。
但是,您的代码还有一个隐藏的问题:您没有指定文件的编码,这意味着如果文件内容包含非ASCII字符并且其编码与Java的平台默认值不匹配,则文件内容可能会出现乱码。要解决此问题,请不要使用FileReader
。相反,使用FileInputStream
并将其包装在InputStreamReader
中,在其构造函数中指定编码。
答案 5 :(得分:0)
您可以使用JTextArea并将其设置为只读:
jtextarea.setEditable(false);
答案 6 :(得分:0)
下面:
String map = "";
int c;
while ((c = rd.read()) != -1) {
map= map + c;
}
你正在做什么把它附加到字符串中。
你应该将它们转换为char。
int c;
while ((c = rd.read()) != -1) {
map= map + ( char ) c;
}
您可以在这些问题中看到更好的模式。