JLabel qui cache le texte après avoir atteint certaine longueur ou le nombre de valeurs

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

  •  22-09-2019
  •  | 
  •  

Question

Le but du JLabel est de montrer un message qui est, comme dans un client par exemple la poste.

Pour: Jean, Marie, Pierre, Frank, Tom, Harry

Je vais avoir les noms dans un vecteur peut donc construire une chaîne à partir de ce puis définissez le texte de l'étiquette à cette chaîne. Cependant, il a le potentiel d'obtenir assez long. Je pense qu'il pourrait être agréable d'avoir quelque chose comme ceci:

Pour: Jean, Marie, Pierre, Frank, Tom, Harry, ...

Ensuite, lorsque vous cliquez sur le ... , il se développera davantage ou tout simplement montrer une infobulle si vous passez la souris sur la ... Oui cette idée est volée de Thunderbird! Je suis ouvert à d'autres idées, ne pas utiliser un JLabel.

Quelqu'un at-il des suggestions?

Merci.

Était-ce utile?

La solution

JLabel ajoutera automatiquement « ... » quand il n'y a pas assez de place pour afficher son contenu. Donc, si vous cherchez à limiter par la largeur de pixel situé juste à la taille maximale sur une étiquette et utiliser un gestionnaire de mise en page qui obéit à ce paramètre (GridBagLayout peut-être).

Cependant, vous voudrez probablement limiter par un certain nombre de noms. Voici un exemple avec une étiquette indiquant les quatre premiers noms devant un bouton « ... ». Lorsque le bouton est cliqué, il modifie le texte de l'étiquette pour afficher tous les noms, et le bouton se retire de la mise en page. texte de noms complet est disponible sur infobulle.

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

Autres conseils

Pas ce que vous voulez, mais une autre solution serait de mettre le texte court dans le texte de votre étiquette et définissez l'info-bulle pour l'étiquette sur le long texte afin que l'utilisateur puisse lire le texte intégral en plaçant le curseur sur l'étiquette.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top