我想创建一个程序,该程序允许用户输入文件名,然后在JLabel中显示文件中写入的所有内容,我设法找到/创建了允许用户输入文件名的代码然后在控制台中显示文件的内容,但是我找不到从JLabel中的文本文件显示所有内容的方法。
有没有办法做到这一点?正如某些人告诉我的那样,这是不可能的。
这是我当前正在使用的代码。
public class OpenFile {
public static void main(String[] args) {
Scanner myObj = new Scanner(System.in); // Create a Scanner object
System.out.println("Enter username: ");
String userName = myObj.nextLine(); // Read user input
BufferedReader br = null;
FileReader fr = null;
try {
//br = new BufferedReader(new FileReader(FILENAME));
fr = new FileReader(userName + ".txt");
br = new BufferedReader(fr);
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
System.out.println(sCurrentLine);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
if (fr != null)
fr.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
答案 0 :(得分:1)
是的...是有可能的,但是正如已经提到的,使用JTextArea或类似的组件会好得多,并且很可能为您省去了一些麻烦。
尽管JLabel基本上是为文本的单个字符串行设计的,但它的确允许将该文本包装在HTML标记内,因此允许基本的HTML / CSS格式化该文本。然后,诀窍是将所需文本文件的每一行读入单个字符串变量,并在您追加读取的每一行时对该字符串进行格式化,通过格式化,我的意思是添加:
JLabel无法识别您已经熟悉的常规换行符,例如"\n"
或"\r\n"
甚至System.lineSeparator();
。但是,如果要应用于JLabel的文本包含在HTML中,它将处理<br>
的HTML换行标记但仅。这是两行JLabel文本的示例:
String txt = "<html>This is line one.<br>This is line two.</html>";
jLabel1.setText(txt);
您的JLabel最终看起来像这样:
在上面的代码行中,字符串文本以<html>
开始,以</html>
结尾。这两个标记之间的任何文本都被认为是用HTML包装的。您还将注意到字符串中的<br>
标签,该标签会强制换行以创建两行。
JLabel的功能非常有限,并且没有HTML 的情况下,它实际上无法完成上面列出的任何项目符号,并且无法在JLabel中显示这样的文本文件:
您当然会注意到上图中的滚动条。 JLabel的另一个问题是,如果需要,它不会显示滚动条。您需要将JLabel放在 JScrollPane 中才能使用此功能,因为很可能会有一些文件超出JLabel的边界,因此您也需要考虑这一点。很简单,不是世界末日。
下面提供的方法将读取提供的文本文件,并将其显示在提供的JLabel中。它将自动将所有内容包装到HTML中,提供标题,将所有文本左移10个像素,对文本进行换行,处理换行符,并注意基本的缩进:
public void displayFileInJLabel(JLabel label, String filePath) {
try {
// Try With Resources (will auto close the reader).
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
/* We use StringBuilder to build our HTML Wrapped
string to display within the JLabel. */
StringBuilder sb = new StringBuilder();
// Get the width of our supplied JLabel
int w = label.getWidth();
/* Calculations for determininfg Line Wrap.
The (w / 4) is a modifiable offset. */
String width = String.valueOf((w - (w / 4)));
/* Deal with Line Wrap (JLabels don't do this) and
set up Left Padding. */
sb.append("<html><body style='width: ").append(width).append("px; padding:10px;'>");
/* Apply the Title Center of JLabel, Blue Color Text,
and Bold Font Style.The size of the text is determined
by the <h1> and </h1> tags. */
sb.append("<center><h1><font color=blue><b>").append(filePath).append("</b></font></h1></center><br>");
// Read in File Lines one at a time.
String line;
while((line = reader.readLine()) != null) {
/* Deal with multiple whitespaces (basic indenting etc) since HTML
doesn't deal well with more than a single whitespace. */
line = line.replaceAll("\\s{4}", " ");
/* Deal with line breaks. JLabels won't deal with them since
it is designed for a single line of text. We therefore
apply the HTML Line Break tag (<br>)at the end of each
text file line to take care of this business. */
line+= "<br>";
sb.append(line);
}
// Apply the closing tags to finish our HTML Wrapping.
sb.append("</body></html>");
/* Set the formated HTML text to the JLabel */
label.setText(sb.toString());
}
}
catch (IOException ex) {
Logger.getLogger("displayFileInJLabel() Method").log(Level.SEVERE, null, ex);
}
}
如果删除所有注释,则实际上并不需要那么多代码,但是还有更多工作要做。构建上面显示的表单示例
在以下位置调用 displayFileInJLabel()方法: JFrame的 ComponentResized 事件,如下所示:
displayFileInJLabel(jLabel1, "C:\\MyFiles\\LoremIpsum.txt");
最好让类成员变量保存文件路径以供查看,而不是对其进行硬编码,然后将该成员变量填充到具有String Type参数的表单的类构造器中。
这完全取决于您要做什么。使用 JTextArea 还是个好主意。