Domanda

Sto cercando di fare un JLabel swing con più righe di testo. E 'aggiunto più che bene, ma le interruzioni di riga non venire attraverso. Come faccio a fare questo? In alternativa, posso solo indicare una larghezza massima di un JLabel e sapere che il testo sarebbe avvolgere, come in 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);        
    }
È stato utile?

Soluzione

Usa HTML in setText, per es.

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

Altri suggerimenti

Per impostazione predefinita, Altalena non a capo del testo. Se si specifica una dimensione sul JLabel sarà dipingere solo la parte del testo che si adatta e quindi aggiungere "..." fino alla fine.

Come suggerito è possibile utilizzare HTML per consentire la disposizione di riga. Tuttavia, in realtà ho creato uno swing personalizzato dell'interfaccia utente delegato non molto tempo fa per raggiungere questo e ancora di più: MultiLineLabelUI .

Sarà avvolgere il testo per adattarsi allo spazio disponibile e rispettare anche interruzioni di riga forzate. Se si sceglie di provarlo, è semplice come:

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

In alternativa, utilizzare in alternativa la classe MultiLineLabel personalizzato che, oltre al confezionamento di testo supporta l'allineamento del testo verticale e orizzontale.

Aggiorna

Ho perso il dominio con gli esempi di codice originale. Si può ora essere visualizzati su github invece: https://github.com/sasjo/multiline

È possibile ottenere a capo automatico se si imposta la larghezza punto in HTML.

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

È possibile inserire codice HTML all'interno di un JLabel e utilizzare il tag linebreak per raggiungere questo obiettivo.

Cosa succede ad usare la funzione di avvolgimento in 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);

Semplice, usare l'HTML. componenti Java Swing anche se non fornisce un supporto 'fantastico' per il codice HTML, è possibile utilizzarlo per questi scopi semplici.

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

non sono riuscito per specificare una larghezza massima di un'etichetta, ma è possibile specificare una larghezza di cemento. Misurando la larghezza corrente di un JLabel possiamo applicare solo la nuova fissa con se la larghezza della JLabels è più alto che il nostro 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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top