Java: Linebreaks in JLabels?
-
12-09-2019 - |
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);
}
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);
}