2

JLabel 的目的是显示消息是给谁的,例如在邮件客户端中

致:约翰、玛丽、彼得、弗兰克、汤姆、哈利

我将把名字放在一个向量中,这样就可以从中建立一个字符串,然后将标签的文本设置为这个字符串。然而,它有可能变得很长。我认为拥有这样的东西可能会很好:

致:约翰、玛丽、彼得、弗兰克、汤姆、哈利……

然后,当您单击“ ... ”时,如果您将鼠标悬停在...上,它将展开更多或仅显示工具提示...是的,这个想法是从 Thunderbird 窃取的!我对其他想法持开放态度,不必使用 JLabel。

有没有人有任何建议?

谢谢。

4

2 回答 2

3

不是您想要的,但另一种解决方案是将短文本放入标签的文本中,并将标签的工具提示设置为长文本,以便用户可以通过将鼠标悬停在标签上来阅读全文。

于 2010-03-26T11:14:58.490 回答
1

当没有足够的空间显示其内容时,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();
  }
}
于 2010-03-26T17:53:29.527 回答