将文件打开到JLabel中

时间:2019-03-19 22:52:21

标签: java file jlabel

我想创建一个程序,该程序允许用户输入文件名,然后在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();

        }

    }

}

}

1 个答案:

答案 0 :(得分:1)

是的...是有可能的,但是正如已经提到的,使用JTextArea或类似的组件会好得多,并且很可能为您省去了一些麻烦。

尽管JLabel基本上是为文本的单个字符串行设计的,但它的确允许将该文本包装在HTML标记内,因此允许基本的HTML / CSS格式化该文本。然后,诀窍是将所需文本文件的每一行读入单个字符串变量,并在您追加读取的每一行时对该字符串进行格式化,通过格式化,我的意思是添加:

  • 标题;
  • 换行符;
  • 缩进;
  • 左边缘填充;
  • 包装纸;
  • 粗体,斜体,下划线;
  • 字体,字体样式,字体大小,甚至字体颜色;
  • 文本对齐方式,例如Left,Center,Right和Justify;
  • 等,等等。

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最终看起来像这样:

enter image description here

在上面的代码行中,字符串文本以<html>开始,以</html>结尾。这两个标记之间的任何文本都被认为是用HTML包装的。您还将注意到字符串中的<br>标签,该标签会强制换行以创建两行。

JLabel的功能非常有限,并且没有HTML 的情况下,它实际上无法完成上面列出的任何项目符号,并且无法在JLabel中显示这样的文本文件:

enter image description here

您当然会注意到上图中的滚动条。 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}", "&nbsp;&nbsp;&nbsp;&nbsp;");

                /* 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);
    }
}

如果删除所有注释,则实际上并不需要那么多代码,但是还有更多工作要做。构建上面显示的表单示例

  • 创建一个新的JFrame表单;
  • 将其 DefaultCloseOperation 属性设置为 DISPOSE
  • 将其 AlwaysOnTop 属性设置为 true ;
  • 在显示表单之前,将其设置为 SetLocationRelativeTo 属性为 null ;
  • JScrollPane 放入JFrame表单。是否占用了 表格的整个大小;
  • 将JLabel放入JScrollPane。占据整个尺寸 JScrollPane的;
  • 将JLabel的背景颜色设置为白色
  • 将JLabel的 Opaque 属性设置为 true
  • 将JLabel的 Horizo​​ntalAlignment 设置为 LEFT
  • 将JLabel的 VerticalAlighnment 设置为 TOP
  • 确保JLabel的 Text 属性为(无);
  • displayFileInJLabel()方法复制并粘贴到 交通便利的地方。如果您愿意,可以在JFrame Form类中进行操作。
  • 在以下位置调用 displayFileInJLabel()方法: JFrame的 ComponentResized 事件,如下所示:

    displayFileInJLabel(jLabel1, "C:\\MyFiles\\LoremIpsum.txt");
    

    最好让类成员变量保存文件路径以供查看,而不是对其进行硬编码,然后将该成员变量填充到具有String Type参数的表单的类构造器中。

这完全取决于您要做什么。使用 JTextArea 还是个好主意。