如何向JLabel
添加換行符?我知道如果我使用簡單的HTML,它會起作用。但是如果我使用html,JLabel
不顯示嵌入應用程序的字體。我使用方法 - createFont()
嵌入字體,並使用JLabel.setFont()
來應用字體。如何在不使用HTML的情況下向JLabel添加換行符
回答
我是使用方法 -
createFont()
)嵌入字體並使用JLabel.setFont()
來應用字體。
請嘗試在HTML中設置它,如here所示。
JLabel最初不是用於多行文字,從我記得的東西。您需要重寫各種呈現方法來手動進行文本行分割。
也許你應該使用不可編輯的JTextArea,如果你想要多行標籤。
,如果你想多行JComponents不使用的JLabel 1),那麼你就必須尋找TextComponent因爲是JTextArea,使其的JTextPane,JEditorPane中,如果should't可編輯然後myTextComponent#setEditable(false);
2)我從來沒有看到問題HTML &字體&顏色在搖擺,例如:
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);
}
});
}
}
我不認爲有直接(並且容易)做多行JLabel的方式沒有反覆到HTML。您可以改用JTextArea。
JTextArea textArea = new JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setOpaque(false);
textArea.setBorder(BorderFactory.createEmptyBorder());
add(textArea, BorderLayout.CENTER);
它應該看起來差不多。如果您有不同的組件不同的字體,你可以添加以下行,以確保JTextArea中的字體是一個JLabel
textArea.setFont(UIManager.getFont("Label.font"));
希望這有助於相同。
SwingX支持多標籤:
JXLabel label = new JXLabel();
label.setLineWrap(true);
當使用多行文本時,JXLabel是否具有「正確的」基準?請注意,「正確」可能對不同的人意味着不同的事情;-) – jfpoilpret
@jfpoilpret - 不知道。什麼是正確的基準? – kleopatra
對於我來說,正確的基線將是標籤第一行第一個字符的基線。但我相信你可以找到其他人更喜歡以標籤的整個高度爲中心的基線;其他人可能也希望基線成爲標籤中最後一行的第一個字符的基線。它實際上取決於人們希望標籤在佈局中對齊的方式。我認爲我的第一個建議最有意義。 – jfpoilpret
大多數下面的代碼是從BasicLabelUI和/或WindowsLabelUI拍攝,但我添加代碼,使其與多行工作。這是我可以開始工作的最小代碼量。您可以使用setSeparator在行之間設置分隔符,也可以通過更改LinesAndIndex實例的默認值來設置分隔符。我還沒有做過這方面的廣泛測試,但迄今爲止它對我很有用。當使用HTML助記符不起作用,所以我創建了這個。如果您有更好的方法來完成此操作,請更正代碼。
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. 在不使用HTML的情況下在JTextPane中進行換行
- 2. 如何在不重寫的情況下向類添加屬性?
- 3. 如何在不損壞CPU的情況下向IE添加大量HTML
- 4. 如何在不使用argparser的情況下添加client_secret?
- 5. 如何在不使用設計器的情況下向Infragistics UltraGrid添加列
- 6. 如何在不使用forEach()的情況下使用HTML元素?
- 7. 如何在不使用@ angular/router的情況下添加添加查詢參數
- 8. 如何在不重定向的情況下向海邊回覆添加Cookie?
- 9. 如何在不破壞javascript代碼的情況下給javascript換行換行符?
- 10. 如何在不使用ActionListener的情況下修改窗口中的JLabel?
- 11. 在沒有DataBind的情況下向GridView添加新行
- 12. 如何在不創建新對象的情況下將多個字符串添加到JLabel中
- 13. D:在不復制的情況下向陣列添加元素
- 14. 如何在不使用換行符或段落標記的情況下製作換行符?
- 15. 在不使用HTML的情況下對字符串中的換行符進行編碼
- 16. 如何在不將字符串分解爲字符的情況下向字符串添加字符串?
- 17. 如何在平滑滾動的情況下向UItableview添加新行
- 18. 如何在不增加內存的情況下在IOS上使用html canvas toDataURL?
- 19. 在不使用XAML的情況下向標題欄添加按鈕
- 20. 在不使用UDF的情況下向pyspark數據框添加新列?
- 21. 如何在不使用HTML的情況下在Notepad ++中運行JavaScript?
- 22. 如何在不使用按鈕的情況下在html表中選擇一行?
- 23. 只有在上下文允許的情況下用html換行符替換單行換行
- 24. 如何在不重定向的情況下執行href
- 25. 在不使用SSML的情況下爲Alexa添加暫停
- 26. Java:在不使用BigInteger的情況下添加大數字
- 27. 在不添加聯繫人的情況下使用CNContactViewController(swift)
- 28. 如何在不改變URL欄的情況下添加HTML哈希鏈接...?
- 29. 在沒有kldload的情況下向FreeBSD添加系統調用
- 30. 如何在不阻擋UI的情況下向WPF程序添加延遲
從我viewpoitn,使用HTML的主要問題是基礎,大多數佈局管理使用時下其中的損失(和這是一個很好的點恕我直言) – jfpoilpret