Question

Je suis en train de faire un JLabel Swing avec plusieurs lignes de texte. Il est ajouté très bien, mais les sauts de ligne ne viennent pas à travers. Comment puis-je faire cela? Sinon, puis-je spécifier simplement une largeur maximale pour un JLabel et de savoir que le texte enveloppait, comme dans un div?

    private void addLegend() {
        JPanel comparisonPanel = getComparisonPanel();

        //this all displays on one line
        JLabel legend = new JLabel("MMM FFF MMM FFFO O OOM   M MMMM.\nMMM FFF MMM FFFO O OOM   M MMMM.\nMMM FFF MMM FFFO O OOM   M MMMM.\n"); 

        comparisonPanel.add(legend);        
    }
Était-ce utile?

La solution

Utiliser HTML dans setText, par exemple.

myLabel.setText("<html><body>with<br>linebreak</body></html>");

Autres conseils

Par défaut, Swing ne boucle pas le texte. Si vous spécifiez une taille sur le JLabel il ne peindre la partie du texte qui correspond, puis ajoutez « ... » à la fin.

Comme le suggère, vous pouvez utiliser HTML pour activer la ligne d'emballage. Cependant, je l'ai effectivement créé un délégué de l'interface utilisateur Swing personnalisé Il n'y a pas longtemps pour atteindre cet objectif et encore plus: MultiLineLabelUI .

Il enveloppera votre texte pour adapter l'espace disponible et respecter également les sauts de ligne. Si vous choisissez de l'essayer, il est aussi simple que:

JLabel label = new JLabel("Text that'll wrap if necessary");
label.setUI(MultiLineLabelUI.labelUI);

Ou bien utiliser la classe MultiLineLabel personnalisée en plus du texte d'emballage prend en charge l'alignement du texte vertical et horizontal.

UPDATE

J'ai perdu le domaine avec les exemples de code d'origine. Il peut maintenant être consulté sur github à la place: https://github.com/sasjo/multiline

Vous pouvez obtenir saut de ligne automatique si vous définissez la largeur du paragraphe en html.

  label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>");

Vous pouvez mettre HTML à l'intérieur d'un JLabel et utiliser la balise linebreak pour y parvenir.

Qu'en est-il d'utiliser la fonction d'emballage dans un JTextArea?

    String text = "some really long string that might need to"+
                  "be wrapped if the window is not wide enough";

    JTextArea multi = new JTextArea(text);
    multi.setWrapStyleWord(true);
    multi.setLineWrap(true);
    multi.setEditable(false);

    JLabel single = new JLabel(text);

    JPanel textpanel = new JPanel(new GridLayout(2,1));
    textpanel.add(multi);
    textpanel.add(single);

    JFrame frame = new JFrame();
    frame.add(textpanel);
    frame.pack();
    frame.setVisible(true);

Simple, utilisez HTML. Java composants Swing ne se fournissent pas un support « fantastique » pour le HTML, vous pouvez l'utiliser à ces fins simples.

label.setText("<html>This is first line.<br/>This is second line.</html>");

Je ne l'ai pas réussi à spécifier une largeur maximale pour une étiquette, mais vous pouvez spécifier une largeur de béton. En mesurant la largeur actuelle d'un JLabel nous ne pouvons appliquer le nouveau fixe avec si la largeur des JLabels est plus élevé que notre maxWidth:

JLabel label = new JLabel("<html>" + myVeryLongMessage + "<html>");
int maxWidth = 400;
Dimension size = label.getPreferredSize();
if (size.width > maxWidth) {
    // Estimate the number of lines
    int lineCount = (int) Math.ceil(((double) size.width) / maxWidth);
    lineCount += 1; // Add one extra line as reserve
    size.width = maxWidth; // Apply the maximum width
    // Increase the height so that all lines will be visible
    size.height *= lineCount;
    label.setPreferredSize(size);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top