gpt4 book ai didi

java - 多色 JLabel

转载 作者:行者123 更新时间:2023-11-30 10:24:26 27 4
gpt4 key购买 nike

我想要一种不同的方式来创建多色 JLabel。(多色 = 不同前景色的文本部分)

到目前为止我找到的唯一解决方案(也是我目前使用的)是在 html 中设置文本。但是我遇到了问题...

当 LayoutManager 决定 JLabel 应该变窄时,在 JLabel 中使用纯文本,文本会被裁剪,并添加“...”。(例如:“My Long Text”-> 变成:“My Long T...”)

对于 JLabel 内的 html,文本被包裹在空格字符的某处,将其余部分留在可绘制区域之外,并且由于 JLabel 的高度不变而不可见。(例如:“我的长文” -> 变成:“我的长文”)

在我的例子中,JLabel 在 JTable 中呈现,它由用户调整大小,更不用说在不同的屏幕分辨率下了。

我尝试在 html 中添加一个“nowrap”属性或一个“”-tag,但它看起来像被忽略了。

留给我 - 我认为 - 一个解决方案:自己绘制标签。或不?有什么建议么?例子?

谢谢。

这是一个非常简单的例子:尝试水平调整此面板的大小,看看两个 JLabel 的...中的文本会发生什么......

(没有提示用户,第二个JLabel的文本不是完整的内容)

-> 在示例中,JLabel 的高度发生变化,但在框架的 JTable 中呈现时,行的高度没有变化,我不希望它发生变化。如果不使用 HTML,它也不会改变高度...

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MultiJLabel
extends JFrame
{
public MultiJLabel()
{
super("Multi-colored JLabel test");

JPanel pnl = new JPanel();
pnl.setLayout(new BorderLayout());
pnl.add(new JLabel("This is a test of My Long Text"), BorderLayout.NORTH);
pnl.add(new JLabel("<html>This is a test of <font color='#ffbebe'>My Long Text</font></html>"), BorderLayout.SOUTH);

this.getContentPane().add(pnl);
this.pack();

this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}

public static void main(String[] args)
{
new MultiJLabel();
}
}

Here's a picture of the original problem, where our users are not aware that the client's Order Number is not what the grid is showing, because this column has HTML-formatted text to show multi-colors.

最佳答案

谢谢大家的评论,但我没有耐心,创建了我自己的 JLabel。我知道这可能是一个糟糕的编程版本,但它对我有用......您可以通过更改上面的示例来测试它:

JMultiColorLabel lbl = new JMultiColorLabel("This is a test of My Long Text");
lbl.setColors(new int[]{10,15}, new Color[]{Color.RED,Color.BLUE});
lbl.setPreferredSize(new Dimension(200,20));
pnl.add(lbl, BorderLayout.SOUTH);

并使用这个类:

import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.util.HashMap;

import javax.swing.JLabel;

public class JMultiColorLabel
extends JLabel
{
private static final String STRING_OVERFLOW = "...";

private HashMap<Integer, Color> extraColors = new HashMap<Integer, Color>();

public JMultiColorLabel(String text)
{
super(text);
}

public void setColors(int[] indices, Color[] colors)
{
for (int i = 0; i < indices.length; i++)
this.extraColors.put(indices[i], colors[i]);
}

protected void paintComponent(Graphics g)
{
// Get text-contents of Label
String text = this.getText();

// No text in the JLabel? -> No risk: super
if (text == null || text.length() == 0)
{
super.paintComponent(g);
return;
}

// Content Array of characters to paint
char[] chars = text.toCharArray();

// Draw nice and smooth
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

// Draw background
if (this.isOpaque())
{
g2d.setColor(this.getBackground());
g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
}

// FontMetrics to calculate widths and height
FontMetrics fm = g2d.getFontMetrics();

// Available space
Insets ins = this.getInsets();
int maxSpace = this.getWidth()-(ins.left+ins.right);
boolean overflow = (fm.stringWidth(text) > maxSpace);

// Starting offset
int offset = ins.left+1;

// The start Color is the default
g2d.setColor(this.getForeground());

// Loop over characters
for (int i = 0; i < chars.length; i++)
{
// Switch Color?
if (this.extraColors.containsKey(i))
g2d.setColor(this.extraColors.get(i));

// Check if we still have enough room for this character
if (overflow && offset >= (maxSpace-fm.stringWidth(STRING_OVERFLOW)))
{ // Draw overflow and stop painting
g2d.drawString(STRING_OVERFLOW, offset, (fm.getHeight()+ins.top));
return;
}
else // We have the space -> Draw the character
g2d.drawString(String.valueOf(chars[i]), offset, (fm.getHeight()+ins.top));

// Move cursor to the next horizontal position
offset += fm.charWidth(chars[i]);
}
}
}

关于java - 多色 JLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46542496/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com