JLabel, который скрывает текст после достижения определенной длины или количества значений - PullRequest
2 голосов
/ 26 марта 2010

Цель JLabel - показать, кому предназначено сообщение, например, в почтовом клиенте, например,

Кому: Джон, Мэри, Питер, Фрэнк, Том, Гарри

У меня будут имена в векторе, поэтому я могу создать строку из этого и затем установить текст метки в эту строку. Однако у него есть потенциал, чтобы получить довольно долго. Я подумал, что было бы неплохо иметь что-то вроде этого:

Кому: Джон, Мэри, Питер, Фрэнк, Том, Гарри, ...

Затем, когда вы нажмете на ' ... ', он развернется больше или просто покажет подсказку, если навести курсор на ... Да, эта идея украдена из Thunderbird! Я открыт для других идей, мне не нужно использовать JLabel.

У кого-нибудь есть предложения?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 26 марта 2010

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

1 голос
/ 26 марта 2010

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();
  }
}
...