Jlabel, которая скрывает текст после достижения определенной длины или количества значений
Вопрос
Цель Jlabel - показать, кто будет сообщением, как в почтовом клиенте, например,
К: Джон, Мэри, Питер, Фрэнк, Том, Гарри
У меня будут имена в векторе, поэтому я могу создать из этого строку, а затем установить текст метки на эту строку. Однако у него есть потенциал, чтобы стать довольно долго. Я думал, что было бы неплохо иметь что -то вроде этого:
К: Джон, Мэри, Питер, Фрэнк, Том, Гарри, ...
Затем, когда вы нажимаете на '...«Это расширит больше или просто покажет наконечник инструмента, если вы мышитесь на ... да, эта идея украдена у Thunderbird! Я открыт для других идей, не должен использовать Jlabel.
У кого -нибудь есть предложения?
Спасибо.
Решение
Jlabel автоматически добавит «...», когда не хватает места для отображения его содержимого. Поэтому, если вы хотите ограничить ширину пикселей, просто установите максимальный размер на метке и используйте диспетчер макетов, который подчиняется этой настройке (может быть, Gridbaglayout).
Однако вы, вероятно, захотите ограничить определенное количество имен. Вот пример с этикеткой, показывающей первые четыре имена перед кнопкой «...». Когда кнопка нажимается, она меняет текст метки, чтобы показать все имена, и кнопка удаляется из макета. Текст полных имен доступен на подсказке.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class LabelDotTest
{
private String fullText = "";
private String clippedText = "";
public LabelDotTest()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(280, 50));
frame.setLocationRelativeTo(null);
String[] testNames = new String[]{"John", "Mary", "Peter", "Hank", "Alys", "Debbie"};
int DISPLAY_MAX = 4;
for(int i=0; i<testNames.length; i++)
{
fullText += testNames[i];
if (i<DISPLAY_MAX)
clippedText += testNames[i];
if (i<testNames.length-1)
{
fullText += ", ";
if (i<DISPLAY_MAX)
clippedText += ", ";
}
}
final JLabel label = new JLabel(clippedText);
label.setToolTipText(fullText);
final JButton button = new JButton("...");
button.setBorder(BorderFactory.createEmptyBorder());
button.setOpaque(false);
button.setBackground(new Color(0,0,0,0));
button.setToolTipText(fullText);
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
label.setText(fullText);
button.getParent().remove(button);
}
});
JPanel panel = new JPanel(new GridBagLayout());
panel.add(label);
panel.add(button);
frame.add(panel);
frame.setVisible(true);
}
public static void main(String[] args)
{
new LabelDotTest();
}
}
Другие советы
Не то, что вы хотите, но другое решение будет поместить короткий текст в тексте для вашей метки и установить подсказку для метки на длинный текст, чтобы пользователь мог прочитать полный текст, парив над меткой.