Ширина 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]

}

}

Когда я запускаю этот код, он возвращает «ШИРИНА: java.awt.Dimension [ширина = 0, высота = 0]», как я разместил в комментариях.

Есть ли способ получить ширину JLabel в конструкторе? Также существует ли какой-либо способ для JLabel, который позволил бы мне переносить слова?


person Community    schedule 30.11.2011    source источник
comment
пожалуйста, изучите соглашения об именах Java и придерживайтесь их   -  person kleopatra    schedule 01.12.2011
comment
Прости. Я предполагаю, что вы имеете в виду chatBubble, который должен быть ChatBubble, и bubble_type, который должен быть bubbleType? Я обычно придерживаюсь их, если только не подбрасываю несколько быстрых идей, пытаясь понять, как что-то сделать, как описано выше.   -  person    schedule 01.12.2011


Ответы (2)


Размер любого компонента Swing будет равен нулю до тех пор, пока он не будет визуализирован, и никак иначе. Однако вы можете оценить размер текста, используя Класс FontMetrics (см. ссылку на API).

Существуют также кладжи, позволяющие переносить слова в JLabel с помощью HTML.

Изменить 1
Относительно вашего вопроса:

Что бы вы предложили в качестве наилучшего способа его оценки? Что-то вроде подсчета символов и умножения на среднюю ширину символа?

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

Что касается моего второго решения, проверьте мой ответ на вопрос здесь: in-jlist-элементы

person Hovercraft Full Of Eels    schedule 30.11.2011
comment
Что бы вы предложили в качестве наилучшего способа его оценки? Что-то вроде подсчета символов и умножения на среднюю ширину символа? Изменить: я проверю этот класс. - person ; 30.11.2011

Вы можете использовать html, чтобы получить разрыв строки в тексте метки:

"<html>first line <br>second line"

Однако вы не можете получить размер любого компонента Swing в конструкторе.

person mort    schedule 30.11.2011
comment
Я считаю, что OP уже знает о внедрении HTML. Таким образом, ваш ответ практически не имеет ценности. - person mre; 30.11.2011
comment
Также существует ли какой-либо способ для JLabel, который позволил бы мне переносить слова? - последнее предложение в его вопросе. - person mort; 30.11.2011
comment
Если эта ширина превышает определенное значение, скажем, 300 пикселей, тогда я хотел бы вставить разрыв строки (по сути, делая перенос слов JLabel в соответствии с максимальной шириной) - использование разрыва ссылки фразы указывает мне, что OP знает о встраивании HTML. - person mre; 30.11.2011
comment
Довольно дальний выстрел. Зачем ему тогда конкретно спрашивать о методе? Может быть, он знает HTML, но не знает, что его можно использовать в компонентах свинга. - person mort; 30.11.2011
comment
Я не знал, как вставить разрыв строки в JLabel (или если бы вы могли). Я знаю этот термин из использования \n и \r\n в PHP (хотя я знаю HTML и его ‹br›, но не то, чтобы вы могли использовать его в JLabel). - person ; 30.11.2011