Ширина JLabel всегда возвращает 0 в конструкторе. Затем, если ширина превышает значение X, вставить разрыв строки?
Я создал класс, который расширяет класс JLabel. Этот класс, по сути, делает более "приятным" для меня присоединение соответствующего IconImage к моему JLabel и корректный размер.
Когда я создаю новый JLabel с помощью кода, я теперь делаю это с помощью something = new MyClass("message", 1);
Для этого кода выше у меня будет MyClass(String msg, int type) {}
конструктор на месте. В этом конструкторе я хочу, чтобы была возможность получить ширину текста, указанного пользователем. Если эта ширина превышает определенное значение, скажем, 300px
затем я хотел бы вставить разрыв строки (по сути, сделать перенос по словам JLabel в соответствии с максимальной шириной).
Я удалил часть в коде ниже, который добавляет изображение в JLabel, потому что это не относится к вопросу - я создал отдельный класс для обработки этого, который уже работает.
package org.me.myimageapp;
import javax.swing.JLabel;
/**
*
* @author Jordan
*/
public class chatBubble extends JLabel {
public static final int BUBBLE_TO_USER = 1;
public static final int BUBBLE_FROM_USER = 2;
chatBubble(String message, int bubble_type) {
if ( (bubble_type!=1) && (bubble_type!=2) ) {
return;
}
this.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
this.setText(message);
this.setVisible(true);
System.out.println("WIDTH: "+this.getSize().toString()); //WIDTH: java.awt.Dimension[width=0,height=0]
}
}
Когда я запускаю этот код, он возвращает "WIDTH: java.awt.Dimension[width=0,height=0]", как я разместил в комментариях.
Есть ли способ, которым я могу получить ширину JLabel в конструкторе? Также существует ли способ для JLabel, который позволил бы мне переносить слова?
2 ответа
Размер любого компонента Swing будет нулевым до тех пор, пока он не будет отрисован, никак не обойтись. Вы можете оценить размер текста, используя класс FontMetrics (см. Ссылку на API).
Есть также kludges, чтобы получить перенос слов в JLabel с помощью HTML
Редактировать 1
По вашему вопросу:
Что бы вы предложили, чтобы быть лучшим способом оценить это? Что-то вроде подсчета символов и умножения на среднюю ширину символа?
Я не знаю, так как я не использовал FontMetrics. Я бы порекомендовал поиграть с этим и посмотреть, что вы можете придумать, а также найти его использование в ответах на этом форуме.
Что касается моего второго решения, пожалуйста, проверьте мой ответ на вопрос здесь: word-wrap-in-jlist-items
Вы можете использовать HTML, чтобы получить разрыв строки в тексте метки:
"<html>first line <br>second line"
Однако вы не можете получить размер любого компонента свинга в конструкторе.