Открытие файла в формате JLabel

#java #swing #file #jlabel

#java #swing #файл #jlabel

Вопрос:

Я хочу создать программу, которая позволяет пользователю вводить имя файла, а затем она отображает все, что написано в файле, в JLabel, мне удалось найти / создать код, который позволяет пользователю вводить имя файла, а затем отображать содержимое файла в консоли, но я не смог найти способ отобразить все из текстового файла в JLabel.

Есть ли способ сделать это? Поскольку некоторые люди сказали мне, что это невозможно сделать.

Комментарии:

1. Использование JLabel звучит как плохая идея. Я думаю, что JTextPane — лучший выбор. docs.oracle.com/javase/tutorial/uiswing/components /…

2. Это действительно не имеет смысла. JLabel предназначен для отображения одной строки текста, а не большого количества текста или нескольких строк текста, и ваш вопрос выглядит как вопрос о проблеме XY , в котором вы спрашиваете, как что-то сделать, используя совершенно неправильный и невозможный подход. Гораздо лучше рассказать об общей вещи, которую вы пытаетесь сделать, а не о неправильном способе, которым вы пытаетесь это сделать.

3. Как насчет jLabel.setText(fileContent);

Ответ №1:

Yes…it возможно, но, как уже упоминалось, вам было бы гораздо лучше использовать JTextArea или аналогичный компонент вместо этого и, скорее всего, избавить себя от некоторых хлопот.

Хотя JLabel в основном предназначен для однострочной строки текста, он позволяет обернуть этот текст в HTML-теги, что позволяет использовать базовые HTML / CSS для форматирования того же текста. Тогда хитрость заключается в том, чтобы прочитать каждую строку нужного текстового файла в одну строковую переменную, форматируя эту строку при добавлении каждой прочитанной строки, и под форматированием я подразумеваю добавление:

  • Заголовок;
  • Разрывы строк;
  • Отступ;
  • Заполнение полей слева;
  • Перенос строк;
  • Жирный шрифт, курсив, подчеркивание;
  • Шрифты, стиль шрифта, размеры шрифта и даже цвета шрифта;
  • Выравнивание текста по левому краю, центру, правому краю и выравнивание по ширине;
  • и т.д. и т.п. и т.п.

JLabel не распознает обычные разрывы строк, с которыми вы уже знакомы, такие как "n" или "rn" или даже System.lineSeparator(); . Однако это будет иметь дело с тегом переноса строки HTML <br> но только в том случае, если текст, применяемый к JLabel, заключен в 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}", "amp;nbsp;amp;nbsp;amp;nbsp;amp;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 значение true;
  • Установите для горизонтального выравнивания JLabel значение ВЛЕВО;
  • Установите для VerticalAlighnment для JLabel значение VerticalAlighnment в значение, равное ,,ВЕРХНЕМУ, , значению;
  • Убедитесь, что свойство JLabel Text пусто (ничего);
  • Скопируйте и вставьте метод displayFileInJLabel() в доступное место. Внутри вашего класса JFrame Form подойдет, если хотите.
  • Поместите вызов метода displayFileInJLabel() в событие componentResized JFrame, что-то вроде этого:

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

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

Все зависит от того, что вы действительно хотите сделать. Использование JTextArea по-прежнему является лучшей идеей.