Come posso aggiungere una nuova riga a JLabel
? So che se uso HTML semplice, funzionerà. Ma se uso html, JLabel
non mostra il carattere incorporato nell'applicazione. Sto incorporando il carattere usando il metodo - createFont()
e usando JLabel.setFont()
per applicare il carattere.Come aggiungere una nuova riga a JLabel senza utilizzare l'HTML
risposta
sto incorporare il tipo di carattere con il metodo -
createFont()
) e l'utilizzo diJLabel.setFont()
per applicare il tipo di carattere.
Invece provare a impostarlo nell'HTML, come mostrato here.
JLabel non è originariamente previsto per il testo multilinea, da quello che ricordo. Dovresti sovrascrivere i vari metodi di rendering per dividere manualmente la linea di testo.
Forse dovresti usare un JTextArea non modificabile se vuoi etichette multilinea.
1) se si vuole JComponents multilinea senza utilizzare JLabel, allora si deve guardare per TextComponent come lo sono JTextArea, JTextPane, JEditorPane, se should't essere modificabili poi myTextComponent#setEditable(false);
2) non vedo mai problemi con html & carattere & colori in swing, per esempio:
import java.awt.Color;
import java.awt.Font;
import javax.swing.*;
public class ButtonFg extends JFrame {
private static final long serialVersionUID = 1L;
public ButtonFg() {
JButton button = new JButton("<html> - myText <br>"
+ " - myText <br>"
+ " - myText <br>"
+ " - myText </html>");
button.setForeground(Color.blue);
button.setFont(new Font("Serif", Font.BOLD, 28));
button.setFocusPainted(false);
add(button);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(150, 150);
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ButtonFg().setVisible(true);
}
});
}
}
Non penso che ci sia un modo diretto (e facile) di fare JLabel con più linee senza ricorrere all'HTML. Puoi invece utilizzare JTextArea.
JTextArea textArea = new JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setOpaque(false);
textArea.setBorder(BorderFactory.createEmptyBorder());
add(textArea, BorderLayout.CENTER);
Dovrebbe sembrare quasi lo stesso. Se si dispone di diversi tipi di carattere per i componenti diversi, è possibile aggiungere la seguente riga al fine di garantire che il carattere del JTextArea è lo stesso con JLabel
textArea.setFont(UIManager.getFont("Label.font"));
Spero che questo aiuti.
SwingX supporta etichette multilinea:
JXLabel label = new JXLabel();
label.setLineWrap(true);
JXLabel ha la linea di base "giusta" quando si usano più righe di testo? Nota che "giusto" può significare cose diverse per persone diverse ;-) – jfpoilpret
@jfpoilpret - non so. Quale sarebbe la linea di base corretta? – kleopatra
per me la linea di base corretta sarebbe la linea di base del primo carattere della prima riga dell'etichetta. Ma sono sicuro che potresti trovare altre persone che preferiscono una linea di riferimento centrata sull'intera altezza dell'etichetta, ad esempio; altre persone potrebbero anche voler che la linea di base sia la linea di base del primo carattere della riga LAST nell'etichetta. In realtà dipende da come le persone vogliono che le etichette siano allineate nei loro layout. Penso che il mio primo suggerimento abbia più senso. – jfpoilpret
La maggior parte del codice seguente è tratto da BasicLabelUI e/o WindowsLabelUI ma ho aggiunto il codice per farlo funzionare con più linee. Questa era la quantità minima di codice copiato che potevo ottenere per funzionare. È possibile impostare il carattere separatore tra le righe con setSeparator o modificando il valore predefinito nell'istanza di LinesAndIndex. Non ho fatto test approfonditi su questo, ma funziona finora per me. Quando si utilizza HTML il mnemonico non ha funzionato, quindi l'ho creato. Se hai un modo migliore per farlo, correggi il codice.
import com.sun.java.swing.plaf.windows.WindowsLabelUI;
import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.plaf.LabelUI;
import javax.swing.plaf.basic.BasicGraphicsUtils;
import javax.swing.plaf.basic.BasicHTML;
import javax.swing.text.View;
public class MultiLineLabelUI extends WindowsLabelUI {
private static MultiLineLabelUI multiLineLabelUI;
private LinesAndIndex lai = new LinesAndIndex(',');
private Rectangle paintIconR = new Rectangle();
private Rectangle paintTextR = new Rectangle();
public static LabelUI createUI(JComponent c) {
if (multiLineLabelUI == null) {
multiLineLabelUI = new MultiLineLabelUI();
}
return multiLineLabelUI;
}
private int getBaseline(JComponent c, int y, int ascent, int w, int h) {
View view = (View) c.getClientProperty(BasicHTML.propertyKey);
if (view != null) {
int baseline = BasicHTML.getHTMLBaseline(view, w, h);
if (baseline < 0) {
return baseline;
}
return y + baseline;
}
return y + ascent;
}
public char getSeparator() {
return lai.getSeparator();
}
public void setSeparator(char ch) {
lai.setSeparator(ch);
}
private String layout(JLabel label, FontMetrics fm,
int width, int height, int lineCnt, int curLine, String text) {
Insets insets = label.getInsets(null);
Icon icon = (label.isEnabled()) ? label.getIcon()
: label.getDisabledIcon();
Rectangle paintViewR = new Rectangle();
paintViewR.width = width - (insets.left + insets.right);
paintViewR.height = (height - (insets.top + insets.bottom))/lineCnt;
paintViewR.x = insets.left;
paintViewR.y = insets.top + (paintViewR.height * curLine);
paintIconR.x = 0;
paintIconR.y = 0;
paintIconR.width = 0;
paintIconR.height = 0;
paintTextR.x = 0;
paintTextR.y = 0;
paintTextR.width = 0;
paintTextR.height = 0;
return layoutCL(label, fm, text, icon, paintViewR, paintIconR,
paintTextR);
}
protected void paintEnabledText(JLabel l, Graphics g,
String s, int textX, int textY, int curLine) {
int mnemonicIndex = lai.getMnemonicIndex();
// W2K Feature: Check to see if the Underscore should be rendered.
if (WindowsLookAndFeel.isMnemonicHidden() == true) {
mnemonicIndex = -1;
}
if (curLine != lai.getMnemonicLineIndex()) {
mnemonicIndex = -1;
}
g.setColor(l.getForeground());
BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex,
textX, textY);
}
protected void paintDisabledText(JLabel l, Graphics g,
String s, int textX, int textY, int curLine) {
int mnemonicIndex = lai.getMnemonicIndex();
// W2K Feature: Check to see if the Underscore should be rendered.
if (WindowsLookAndFeel.isMnemonicHidden() == true) {
mnemonicIndex = -1;
}
if (curLine != lai.getMnemonicLineIndex()) {
mnemonicIndex = -1;
}
if (UIManager.getColor("Label.disabledForeground") instanceof Color
&& UIManager.getColor("Label.disabledShadow") instanceof Color) {
g.setColor(UIManager.getColor("Label.disabledShadow"));
BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex,
textX + 1, textY + 1);
g.setColor(UIManager.getColor("Label.disabledForeground"));
BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex,
textX, textY);
} else {
Color background = l.getBackground();
g.setColor(background.brighter());
BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex,
textX + 1, textY + 1);
g.setColor(background.darker());
BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex,
textX, textY);
}
}
@Override
public void paint(Graphics g, JComponent c) {
JLabel label = (JLabel) c;
String text = label.getText();
Icon icon = (label.isEnabled())
? label.getIcon()
: label.getDisabledIcon();
if ((icon == null) && (text == null)) {
return;
}
char mnemonic = (char) label.getDisplayedMnemonic();
lai.splitText(text, mnemonic);
List<String> lines = lai.getLines();
FontMetrics fm = label.getFontMetrics(g.getFont());
String[] clippedText = new String[lines.size()];
for (int i = 0; i < lines.size(); i++) {
clippedText[i] = layout(label, fm, c.getWidth(), c.getHeight(),
lines.size(), i, lines.get(i));
if (icon != null && i == 0) {
icon.paintIcon(c, g, paintIconR.x, paintIconR.y);
}
if (text != null) {
int textX = paintTextR.x;
int textY = paintTextR.y + fm.getAscent();
if (label.isEnabled()) {
paintEnabledText(label, g, clippedText[i], textX,
textY, i);
} else {
paintDisabledText(label, g, clippedText[i], textX,
textY, i);
}
}
}
}
@Override
public int getBaseline(JComponent c, int width, int height) {
super.getBaseline(c, width, height);
JLabel label = (JLabel) c;
String text = label.getText();
if (text == null || "".equals(text) || label.getFont() == null) {
return -1;
}
char mnemonic = (char) label.getDisplayedMnemonic();
lai.splitText(text, mnemonic);
List<String> lines = lai.getLines();
FontMetrics fm = label.getFontMetrics(label.getFont());
String[] clippedText = new String[lines.size()];
for (int i = 0; i < lines.size(); i++) {
clippedText[i] = layout(label, fm, width, height, lines.size(), i,
lines.get(i));
}
return getBaseline(label, paintTextR.y, fm.getAscent(),
paintTextR.width, paintTextR.height);
}
private static class LinesAndIndex {
private char sep;
private List<String> lines;
private int mnemonicLineIndex;
private int mnemonicIndex;
LinesAndIndex(char sep) {
mnemonicLineIndex = -1;
mnemonicIndex = -1;
lines = new ArrayList<String>();
this.sep = sep;
}
public char getSeparator() {
return sep;
}
public void setSeparator(char sep) {
this.sep = sep;
}
public List<String> getLines() {
return lines;
}
public int getMnemonicLineIndex() {
return mnemonicLineIndex;
}
public int getMnemonicIndex() {
return mnemonicIndex;
}
public void splitText(String text, char mnemonic) {
if (text == null) {
return;
}
lines.clear();
mnemonicLineIndex = -1;
mnemonicIndex = -1;
char um = Character.toUpperCase(mnemonic);
char lm = Character.toLowerCase(mnemonic);
int umi = Integer.MAX_VALUE;
int lmi = Integer.MAX_VALUE;
int umli = -1;
int lmli = -1;
for (int i = 0, j = 0, k = 0; i < text.length(); i++) {
if (text.charAt(i) == sep) {
lines.add(text.substring(j, i));
j = i + 1;
k++;
} else if (text.charAt(i) == um) {
if (umi == Integer.MAX_VALUE) {
umi = i - j;
umli = k;
}
} else if (text.charAt(i) == lm) {
if (lmi == Integer.MAX_VALUE) {
lmi = i - j;
lmli = k;
}
}
if (i == text.length() - 1) {
lines.add(text.substring(j, i + 1));
}
}
mnemonicLineIndex = (lmi < umi) ? lmli : umli;
mnemonicIndex = (lmi < umi) ? lmi : umi;
}
}
}
- 1. Come aggiungere una nuova riga in una JLabel con variabili
- 2. Aggiungere una nuova riga a un NSString
- 3. Come aggiungere JLabel a JEditorPane?
- 4. Come aggiungere testo a QPlainTextEdit senza aggiungere una nuova riga e mantenere lo scroll in basso?
- 5. Come aggiungere testo a un file su una nuova riga
- 6. Aggiungere una nuova riga a un file CSV
- 7. aggiungere una nuova riga in una tabella
- 8. Java: come aggiungere l'immagine a Jlabel?
- 9. Aggiungere una nuova riga nel file di?
- 10. Aggiungere una "nuova riga" in innerHTML
- 11. print() senza una nuova riga in Dart?
- 12. NSLog senza nuova riga
- 13. Come associare QModelIndex a una nuova riga?
- 14. Come aggiungere dinamicamente una nuova colonna a una tabella HTML
- 15. Come aggiungere una nuova riga a C# DataTable in 1 riga di codice?
- 16. Come aggiungere una classe a una nuova riga in un data jquery?
- 17. Come aggiungere una nuova riga al file excel in C#
- 18. Come aggiungere una nuova riga nella presentazione Markdown?
- 19. Come aggiungere una nuova riga alla fine di file.write()?
- 20. Aggiungere e rimuovere un'icona su una JLabel
- 21. Come impedire a YAML di scaricare una riga lunga senza nuova riga
- 22. Come posso stampare una nuova riga senza svuotare il buffer?
- 23. Come stampare una stringa utilizzando pl/sql senza aggiungere il carattere della nuova riga alla fine
- 24. Lunga stringa PHP senza nuova riga
- 25. Come aggiungere una nuova riga di testo a un file esistente in Java?
- 26. Fare clic su una JLabel per aprire una nuova cornice
- 27. Come aggiungere un comportamento di selezione a JLabel
- 28. Come aggiungere una nuova colonna Struct a un DataFrame
- 29. Come disegnare su una JLabel?
- 30. Aggiunta di una nuova riga a una sottoclasse QAbstractListModel
Dal mio punto di vista, il problema principale con l'utilizzo di HTML è la perdita di base, che la maggior parte dei gestori di layout utilizza oggigiorno (e questo è un buon punto IMHO) – jfpoilpret