Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Можно создать многострочную кнопку!

Перевод на русский © Сергей Миссан, 2000
Оригинал статьи опубликован на сайте Javable.com

Java Q&A

Предположим, я хочу создать кнопку с меткой, как показано ниже:

"Ваше

Имя"

"Имя" должно быть во второй строке.

Я пытался написать:

new JButton("Ваше \\n Имя")

К сожалению, у меня ничего не получилось. У вас есть какие-нибудь советы?

Короткий ответ: вы не сможете это сделать без значительных усилий. JButton не содержит внутренних возможностей для переноса длинных строк или начала новой строки, если текст содержит \n.

Все компоненты JFC отображаются с помощью соответствующего ComponentUI. Вместо того, чтобы помещать весь код отрисовки в метод paint JButton, JButton передает фунции отображения в ButtonUI (расширение ComponentUI). ComponentUI позволяет нам менять look and feel для Java Swing GUI на лету просто меняя рендереры ComponentUI в нашем JComponents.

Одна из реализаций ButtonUI, которую может использовать JButton -- это BasicButtonUI. Если вы достаточно храбры для того, чтобы заглянуть в код BasicButtonUI, вы обнаружите метод:

protected void paintText(Graphics g, JComponent c,
Rectangle textRect, String text)

paintText() выполняет всю грязную работу по отрисовке строки. Если мы копнем немного глубже, то обнаружим, что этот метод передает само отображение в метод drawString() в BasicGraphicsUtils:

public static void drawString(Graphics g,String
text,int underlinedChar,int x,int y)

drawString() выполняет небольшую обработку и далее просто вызывает метод drawString() из класса Graphics. Нам пришлось повозиться, но теперь достаточно очевидно, почему JButton не будет делать перенос строки.

Так что, для того чтобы сделать то, что вы хотите у вас есть несколько вариантов:

  • Вы можете создать свою собственную JButton, расширив JButton и перекрыв метод paint. В этом методе вы разобъете строку на основе \n, сделаете несколько вычислений размеров, отрисуете кнопку и затем выведете разбитый текст. Однако, если вы пойдете этим путем, ваша кнопка потеряет возможность подключать look and feel. Также вы можете утратить некоторые эффекты отображения в Swing.
  • Вы можете создать новый ButtonUI, который будет правильно форматировать ваш текст.
  • Вы можете использовать комбинацию из JLabels и JButton для получения того, что вам надо, вместо своей собственной кнопки. Попробуйте следующее:
JButton b = new JButton();

 b.setLayout(new BorderLayout());
 JLabel label1 = new JLabel("Ваше");
 JLabel label2 = new JLabel("Имя");

 b.add(BorderLayout.NORTH,label1);
 b.add(BorderLayout.SOUTH,label2);

Если вы обнаружите, что вам приходится часто использовать многострочную кнопку, вы можете вложить вышеприведенное решение в новый класс, скажем MultiLineButton. Этот класс будет расширять JButton, содержать две копии JLabel и методы void setLabel1Text(String text) и void setLabel2Text(String text).

Swing могут отображать HTML!

Похоже, что мой превоначальный ответ о многострочных кнопках был неполным. Когда я писал свой ответ, я использовал Java 1.1.7 и Swing 1.0.3, для которых ответ остается правильным. Многие разработчики (включая меня) по-прежнему используют эти старые версии. Однако новые версии Swing способны отображать HTML.

Вот два совета, написанные двумя активными читателями JavaWorld:

    Довольно много компонентов в Swing могут отрисовывать свое содержимое используя HTML. В результате, вы можете создать многострочную кнопку с помощью следующего кода:
    JButton b = new JButton("<html>Your<br>Name");
    
    -- Sebastian Fernandez
И
    Для решения проблемы с многострочной кнопкой просто напишите:
    JButton myButton = new JButton
    ("<html>Hello<p>World</html>");
    
    Заметьте, что не все компоненты в Swing подерживают HTML.

    -- Tarek Hammoud

Об авторе

Тони Синтес работает старшим консультантом в ObjectWave, специализируясь на телекоммуникациях. Тони работает с Java начиная с 1997 года и является Sun-certified Java 1.1 программистом и Java 2 разработчиком.

Reprinted with permission from the March 2000 edition of JavaWorld magazine.
Copyright © ITworld.com, Inc., an IDG Communications company.
View the original article at: http://www.javaworld.com/javaworld/ 2000-03/01-qa-button.html

Назад | Содержание | Вперед

 

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...