Ответ 1
Я внедряю шрифт с помощью метода -
createFont()
) и используяJLabel.setFont()
для применения шрифта.
Вместо этого попробуйте установить его в HTML, как показано здесь.
Как добавить новую строку в JLabel
? Я знаю, если я использую простой HTML, он будет работать. Но если я использую html, JLabel
не показывает шрифт, который встроен в приложение. Я вставляю шрифт с помощью метода - createFont()
и используя JLabel.setFont()
для применения шрифта.
Я внедряю шрифт с помощью метода -
createFont()
) и используяJLabel.setFont()
для применения шрифта.
Вместо этого попробуйте установить его в HTML, как показано здесь.
SwingX поддерживает многострочные метки:
JXLabel label = new JXLabel();
label.setLineWrap(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"));
Надеюсь, что это поможет.
JLabel изначально не предназначен для многострочного текста, из того, что я помню. Вам нужно будет переопределить различные методы рендеринга, чтобы разделить текстовую строку вручную.
Возможно, вам лучше использовать нередактируемую JTextArea, если вы хотите многострочные метки.
1), если вы хотите использовать многострочные JComponents без использования JLabel, вам нужно искать TextComponent, как JTextArea, JTextPane, JEditorPane, если его следует редактировать, то myTextComponent#setEditable(false);
2) Я никогда не вижу проблемы с Html и шрифтом и цветом в Swing, например:
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);
}
});
}
}
Большая часть следующего кода взята из 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;
}
}
}