Работаем с JLabel

JLabel это пожалуй самый простой компонент, который есть в Java Swing. С помощью JLabel можно показать текст с иконкой. Если нужен какой-то компонент, чтобы отобразить какое-то сообщение пользователю или сделать для поля ввода текстовую метку, или показать иконку — используем JLabel. Текст, который показывает JLabel выделять нельзя, только смотреть.

Для создания объекта JLabel, который затем будем располагать в окне, можно воспользоваться конструктором со строковым параметром public JLabel(String text). Строковый параметр — это текст, который будет показываться в JLabel. Кроме того текст, который будет отображаться в JLabel можно установить при помощи метода setText. Единственным параметром метода является строка отображаемого текста String.

JLabel позволяет настраивать шрифт, который будет использоваться для отображения текста. Установка шрифта происходит при помощи метода setFont класса JLabel. Этому методу в качестве параметра передается объект Font. Что мы хотим, когда указываем или создаем шрифт? Первое — это начертание, Verdana или Courier New, или другое. Второе — размер шрифта и третье — жирный будет шрифт или нормальный, или может быть курсив. Поэтому подходящий конструктор для Font это тот, который содержит сразу все три параметра — public Font(String name, int style, int size). Первый параметр, как уже ясно, это имя шрифта. Если параметр не задан, то используется шрифт по умолчанию. Второй параметр задает стиль — жирный, нормальный или курсив. Сюда необходимо передать одну из констант объекта Font — Font.BOLD (жирный), Font.PLAIN (нормальный или плоский) и Font.ITALIC (курсив). Ну и третий параметр — размер шрифта. Объект Font можно создать вот так:

Font font = new Font("Verdana", Font.PLAIN, 11);

После установки текста и шрифта у JLabel иногда бывает нужно определить выравнивание текста по вертикали и горизонтали. Делается это при помощи двух методов setVerticalAlignment и setHorizontalAlignment соответственно. В качестве параметров для setVerticalAlignment нужно использовать что-то из следующего списка: JLabel.TOP (выравнивать по верхнему краю), JLabel.CENTER (по центру) и JLabel.BOTTOM (выравнивание по нижнему краю). Для метода setHorizontalAlignment параметров больше — JLabel.LEFT (по левому краю), JLabel.CENTER (по центру), JLabel.RIGHT (по правому краю), JLabel.LEADING и JLabel.TRAILING. Интересны последние две константы. Для языков, у которых написание текста идет слева направа JLabel.LEADING — это левый край, а JLabel.TRAILING — правый. Для языков, у которых написание происходит справа налева, JLabel.LEADING — это правый край, а JLabel.TRAILING — левый.

JLabel позволяет отображать иконку вместе с текстом. Для установки иконки используется метод setIcon. Единственный параметр метода — это объект Icon. Когда задана иконка для JLabel, то можно задать расположение текста относительно иконки. Для этого используются методы setVerticalTextPosition и setHorizontalTextPosition. В качестве параметров используются те же константы, что и при выравнивании текста.

Идем дальше. Шрифт мы выбрали. Теперь нужно определить, какого цвета будет текст у нашего JLabel. Делается это при помощи метода setForeground. Сюда нужно передать объект Color. Для создания Color можно воспользоваться разными конструкторами или вместо этого воспользоваться константами, которые определены в объекте Color. Здесь есть черный Color.BLACK, зеленый Color.GREEN, красный Color.RED и другие. Если нужно создать какой-то специфический цвет, то придется воспользоваться конструктором. Для меня, например, самый удобный public Color(int red, int green, int blue). Передаем сюда необходимые составляющие цвета и получаем то, что хотели. Ну а затем устанавливаем цвет у JLabel.

label.setForeground(Color.GREEN);

Кроме цвета шрифта можно задать цвет фона JLabel. Делается это с помощью метода setBackground. Интересный момент. По умолчанию, даже если цвет фона установлен, фон у JLabel не отображается. Для того, чтобы JLabel стал показывать фон необходимо вызвать метод setOpaque и передать туда true. Тем самым мы скажем JLabel, что хотим сделать непрозрачным его фон. Цвет фона задается аналогично цвету текста, то есть методу setBackground передается объект Color, который содержит информацию о цвете.

У JLabel, как и у других компонентов, можно устанавливать размеры. Делается это при помощи метода setPreferredSize. Сюда передается объект Dimension с требуемой шириной и высотой.

label.setPreferredSize(new Dimension(100, 100));

Еще одна особенность, про которую нужно обязательно рассказать — это использование HTML в качестве текста. К примеру, в тестовом приложении JLabel используется для того, чтобы показать краткое
описание Google Labs на английском языке.

По традиции тестовое приложение. Здесь я попытался продемонстрировать возможности на практике, о которых говорилось выше. На самой верхней панели можно увидеть результат работы с методами, устанавливающими выравнивание текста JLabel. Для того, чтобы было лучше видно выравнивание, я добавил к каждому JLabel черный border шириной в один пиксель. На средней панели — работа с позиционированием текста JLabel относительно иконки и наконец на самой нижней — использование HTML для отображения в JLabel текста. Внешний вид приложения представлен на рисунке ниже.

working_with_jlabel

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;

import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.Border;

public class TestFrame extends JFrame {

     public static void createGUI() {
          JFrame frame = new JFrame("Test frame");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          Dimension labelSize = new Dimension(80, 80);
          
          Border solidBorder = BorderFactory.createLineBorder(Color.BLACK, 1);
          
          JPanel mainPanel = new JPanel();
          mainPanel.setLayout(new BorderLayout());
          
          JPanel alignmentPanel = new JPanel(new FlowLayout());
          alignmentPanel.setBorder(BorderFactory.createTitledBorder("Alignment"));
          
          Font font = new Font("Verdana", Font.PLAIN, 12);
          
          JLabel topLabel = new JLabel("Top");
          topLabel.setVerticalAlignment(JLabel.TOP);
          topLabel.setHorizontalAlignment(JLabel.CENTER);
          topLabel.setPreferredSize(labelSize);
          topLabel.setBorder(solidBorder);
          topLabel.setFont(font);
          topLabel.setForeground(Color.GREEN);
          alignmentPanel.add(topLabel);
          
          font = new Font(null, Font.ITALIC, 13);
          
          JLabel bottomLabel = new JLabel("Bottom");
          bottomLabel.setVerticalAlignment(JLabel.BOTTOM);
          bottomLabel.setHorizontalAlignment(JLabel.CENTER);
          bottomLabel.setPreferredSize(labelSize);
          bottomLabel.setBorder(solidBorder);
          bottomLabel.setFont(font);
          bottomLabel.setForeground(Color.RED);
          alignmentPanel.add(bottomLabel);
          
          JLabel leftLabel = new JLabel("Left");
          leftLabel.setVerticalAlignment(JLabel.CENTER);
          leftLabel.setHorizontalAlignment(JLabel.LEFT);
          leftLabel.setPreferredSize(labelSize);
          leftLabel.setBorder(solidBorder);
          leftLabel.setForeground(Color.BLUE);
          alignmentPanel.add(leftLabel);
          
          font = new Font(null, Font.BOLD, 10);
          
          JLabel rightLabel = new JLabel("Right");
          rightLabel.setVerticalAlignment(JLabel.CENTER);
          rightLabel.setHorizontalAlignment(JLabel.RIGHT);
          rightLabel.setPreferredSize(labelSize);
          rightLabel.setBorder(solidBorder);
          rightLabel.setForeground(Color.GRAY);
          rightLabel.setFont(font);
          alignmentPanel.add(rightLabel);
          
          font = new Font("Century Gothic", Font.BOLD, 14);
          
          JLabel centerLabel = new JLabel("Center");
          centerLabel.setVerticalAlignment(JLabel.CENTER);
          centerLabel.setHorizontalAlignment(JLabel.CENTER);
          centerLabel.setPreferredSize(labelSize);
          centerLabel.setBorder(solidBorder);
          centerLabel.setFont(font);
          alignmentPanel.add(centerLabel);
          
          mainPanel.add(alignmentPanel, BorderLayout.NORTH);
          
          JPanel textPositionPanel = new JPanel();
          textPositionPanel.setBorder(
                    BorderFactory.createTitledBorder("Text position"));
          
          Icon icon = UIManager.getIcon("OptionPane.errorIcon");
          
          JLabel textPosLeftTopLabel = new JLabel("LT");
          textPosLeftTopLabel.setVerticalTextPosition(JLabel.TOP);
          textPosLeftTopLabel.setHorizontalTextPosition(JLabel.LEFT);
          textPosLeftTopLabel.setPreferredSize(labelSize);
          textPosLeftTopLabel.setBorder(solidBorder);
          textPosLeftTopLabel.setIcon(icon);          
          textPositionPanel.add(textPosLeftTopLabel);
          
          icon = UIManager.getIcon("OptionPane.informationIcon");
          
          JLabel textPosLeftBottomLabel = new JLabel("LB");
          textPosLeftBottomLabel.setVerticalTextPosition(JLabel.BOTTOM);
          textPosLeftBottomLabel.setHorizontalTextPosition(JLabel.LEFT);
          textPosLeftBottomLabel.setPreferredSize(labelSize);
          textPosLeftBottomLabel.setBorder(solidBorder);
          textPosLeftBottomLabel.setIcon(icon);          
          textPositionPanel.add(textPosLeftBottomLabel);
          
          icon = UIManager.getIcon("OptionPane.questionIcon");
          
          JLabel textPosRightTopLabel = new JLabel("RT");
          textPosRightTopLabel.setVerticalTextPosition(JLabel.TOP);
          textPosRightTopLabel.setHorizontalTextPosition(JLabel.RIGHT);
          textPosRightTopLabel.setPreferredSize(labelSize);
          textPosRightTopLabel.setBorder(solidBorder);
          textPosRightTopLabel.setIcon(icon);          
          textPositionPanel.add(textPosRightTopLabel);
          
          icon = UIManager.getIcon("OptionPane.errorIcon");
          
          JLabel textPosRightBottomLabel = new JLabel("RB");
          textPosRightBottomLabel.setVerticalTextPosition(JLabel.BOTTOM);
          textPosRightBottomLabel.setHorizontalTextPosition(JLabel.RIGHT);
          textPosRightBottomLabel.setPreferredSize(labelSize);
          textPosRightBottomLabel.setBorder(solidBorder);
          textPosRightBottomLabel.setIcon(icon);          
          textPositionPanel.add(textPosRightBottomLabel);
          
          icon = UIManager.getIcon("OptionPane.informationIcon");
          
          JLabel textPosCenterLabel = new JLabel("Center top");
          textPosCenterLabel.setVerticalTextPosition(JLabel.TOP);
          textPosCenterLabel.setHorizontalTextPosition(JLabel.CENTER);
          textPosCenterLabel.setPreferredSize(labelSize);
          textPosCenterLabel.setBorder(solidBorder);
          textPosCenterLabel.setIcon(icon);          
          textPositionPanel.add(textPosCenterLabel);                    
          
          mainPanel.add(textPositionPanel, BorderLayout.CENTER);
          
          JPanel htmlPanel = new JPanel();
          htmlPanel.setBorder(BorderFactory.createTitledBorder("HTML"));
          
          String text = "<html><h2>What is Google Labs?</h2>" +
                    "<font face=’verdana’ size = 2>" +
                    " Google Labs is a playground <br>" +
                    " where our more adventurous users can play around with <br>" +
                    " prototypes of some of our wild and crazy ideas and <br>" +
                    " offer feedback directly to the engineers who developed<br>" +
                    " them. Please note that Labs is the first phase in <br>" +
                    " a lengthy product development process and none of this <br>" +
                    " stuff is guaranteed to make it onto Google.com. <br>" +
                    " While some of our crazy ideas might grow into the <br>" +
                    " next Gmail or iGoogle, others might turn out to be, <br>" +
                    " well, just plain crazy.</html>";
          
          font = new Font(null, Font.PLAIN, 10);
          
          JLabel htmlLabel = new JLabel();
          htmlLabel.setText(text);
          htmlLabel.setFont(font);
          htmlPanel.add(htmlLabel);
          
          mainPanel.add(htmlPanel, BorderLayout.SOUTH);

          frame.getContentPane().add(mainPanel);
          frame.setPreferredSize(new Dimension(450, 485));
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
     }

     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    JFrame.setDefaultLookAndFeelDecorated(true);
                    createGUI();
               }
          });
     }
}
Advertisements

24 Responses to Работаем с JLabel

  1. badmod says:

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

    • bondforever says:

      Надо поковырять и посмотреть, попробую глянуть.

      • bondforever says:

        Для JLabel у меня не получилось сделать автоперенос html. А вот для JEditorPane получилось. К примеру, если создать его вот так JEditorPane editorPane = new JEditorPane(«text/html», text); где первый параметр указывает, что в компоненте будет располагаться html, то перенос осуществляется автоматически. Поэтому для JLabel скорее всего нужно указывать руками, что и как переносить.

      • Рустам says:

        Немного помудрил и мне удалось добиться автоматического переноса в JLabel.
        Дkz того чтобы автоматически переносились слова дотаточно перед текстом вставить тэг

  2. badmod says:

    спасибо) и еще вопросик какой фун-ей можно получить абсолютную позицию элемента относительно фрейма?

    • bondforever says:

      Если честно, даже не знаю, ни разу не юзал подобного. Посмотрю. Если что найду отпишу.

    • olexande says:

      Вычислить пробовали?
      Размер некоторых областей (окон, например), можно у системы выспросить …
      И уже в области просчитать …

  3. badmod says:

    и еще, есть ли возможность сделать так:
    JLabel Label[i] = new JLabel() , где [i] это меняющееся число
    другими словами автоматизировать процесс работы с
    JLabel Label1 = new JLabel()
    JLabel Label2 = new JLabel()
    JLabel Label3 = new JLabel()… и тд.
    Заранее спасибо!

  4. badmod says:

    Очень бы хотелось увидеть статью по работе с классом FontMetrics и со всеми методами

  5. badmod says:

    со всеми методами FontMetrics и совместная работа с JLabel,
    а еще побольше бы инфы как работать с картинками (загрузка, замена JButton картинкой и тп.) Было бы здорово!

    • bondforever says:

      Немного рассказал о FontMetrics и сделал тестовый пример. Чуть попозже пробегусь по всем методам FontMetrics и попробую описать, что каждый из них делает и возвращает.

  6. badmod says:

    спасибо! (и еще очень жду от тебя статью — как работать с картинками)

  7. Астамур says:

    Не выводится, если layout установлен как null…
    FlowLayout ставишь — работает, но в нём сам координаты не установишь через setLocation…((

    • bondforever says:

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

  8. а файлом можете выложить ?

  9. GVC says:

    блин тока взялся jav’у изучать таким нубом себя чувствую ))))))))

  10. Vivas says:

    Можно ли чтобы Label’ы стояли плотно друг к другу?

  11. GHOST says:

    А можно ли сделать Label с изменяющимся текстом? Хочу часики сделать, ( передаю константы с временем и записываю их в текст) и они записываются статично, и часики стоят(((

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: