Jlabel, которая скрывает текст после достижения определенной длины или количества значений

StackOverflow https://stackoverflow.com/questions/2522733

  •  22-09-2019
  •  | 
  •  

Вопрос

Цель 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();
  }
}

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top