Открытие файла в JLabel - PullRequest
       293

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

0 голосов
/ 20 марта 2019

Я хочу создать программу, которая позволяет пользователю вводить имя файла, а затем показывает все, что написано в файле в 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 Ответ

1 голос
/ 20 марта 2019

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

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

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

JLabel не распознает обычные разрывы строк, с которыми вы уже знакомы, например "\n" или "\r\n" или даже System.lineSeparator();.Однако он будет работать с тегом разрыва строки HTML <br> , но только , если текст, применяемый к JLabel, заключен в HTML.Вот пример двухстрочного текста JLabel:

String txt = "<html>This is line one.<br>This is line two.</html>";
jLabel1.setText(txt);

В конечном итоге ваш JLabel будет выглядеть примерно так:

enter image description here

Обратите внимание, что в строке кода выше текст String начинается с <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 свойство до true ;
  • Установите Горизонтальное выравнивание JLabel на ВЛЕВО ;
  • Установите VerticalAlighnment JLabel на TOP ;
  • Убедитесь, что свойство JLabel Text имеет значение пусто (ничего);
  • Скопируйте и вставьте displayFileInJLabel () методв доступном месте.Внутри вашего класса форм JFrame, если хотите, это будет делать.
  • Выполните вызов метода displayFileInJLabel () внутри события JFrame ComponentResized , что-то вроде этого:

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

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

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

...