Swing HTML 绘制字符串

发布于 2024-12-10 11:08:24 字数 448 浏览 0 评论 0原文

我正在尝试为特定目的创建一些特殊组件,在该组件上我需要绘制一个 HTML 字符串,这里是一个示例代码:

 public class MyComponent extends JComponent{
     public MyComponent(){
        super();
     }

     protected void paintComponent(Graphics g){
        //some drawing operations...
        g.drawString("<html><u>text to render</u></html>",10,10);
     }
 }

不幸的是,drawString 方法似乎无法识别 HTML 格式,它愚蠢地绘制字符串,就像这是。

有什么办法可以让它发挥作用吗?

I'm trying to create some special component for a specific purpose, on that component I need to draw a HTML string, here's a sample code:

 public class MyComponent extends JComponent{
     public MyComponent(){
        super();
     }

     protected void paintComponent(Graphics g){
        //some drawing operations...
        g.drawString("<html><u>text to render</u></html>",10,10);
     }
 }

Unfortunately the drawString method seems to be not recognizing the HTML format, it foolishly draws the string just as it is.

Is there any way to make that work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

浪漫之都 2024-12-17 11:08:24

如果是 Java2D 的粉丝;但为了在 Swing 组件和布局中充分利用 HTML,我鼓励您使用 @camickr 建议的组件方法。如有必要,您可以使用 Flyweight 渲染器方法参见JTable,其中重复使用单个组件进行绘图。下面的示例是该技术非常的简化轮廓,仅更改颜色和位置。

附录:更新的示例;另请参见 CellRendererPane使您的应用程序飞翔:实施 Flyweight 以提高性能

在此处输入图像描述

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.CellRendererPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/7774960 */
public class PaintComponentTest extends JPanel {

    private static final int N = 8;
    private static final String s = "<html><big><u>Hello</u></html>";
    private JLabel renderer = new JLabel(s);
    private CellRendererPane crp = new CellRendererPane();
    private Dimension dim;

    public PaintComponentTest() {
        this.setBackground(Color.black);
        dim = renderer.getPreferredSize();
        this.add(crp);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int i = 0; i < N; i++) {
            renderer.setForeground(Color.getHSBColor((float) i / N, 1, 1));
            crp.paintComponent(g, renderer, this,
                i * dim.width, i * dim.height, dim.width, dim.height);
        }
    }

    private void display() {
        JFrame f = new JFrame("PaintComponentTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setSize(dim.width * N, dim.height * (N + 1));
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new PaintComponentTest().display();
            }
        });
    }
}

If a fan of Java2D; but to get the most leverage from HTML in Swing components and layouts, I'd encourage you to use the component approach suggested by @camickr. If necessary, you can use the flyweight renderer approach seen in JTable, et al, in which a single component is used repeatedly for drawing. The example below is a very simplified outline of the technique, changing only the color and location.

Addendum: Updated example; see also CellRendererPane and Make your apps fly: Implement Flyweight to improve performance.

enter image description here

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.CellRendererPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/7774960 */
public class PaintComponentTest extends JPanel {

    private static final int N = 8;
    private static final String s = "<html><big><u>Hello</u></html>";
    private JLabel renderer = new JLabel(s);
    private CellRendererPane crp = new CellRendererPane();
    private Dimension dim;

    public PaintComponentTest() {
        this.setBackground(Color.black);
        dim = renderer.getPreferredSize();
        this.add(crp);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int i = 0; i < N; i++) {
            renderer.setForeground(Color.getHSBColor((float) i / N, 1, 1));
            crp.paintComponent(g, renderer, this,
                i * dim.width, i * dim.height, dim.width, dim.height);
        }
    }

    private void display() {
        JFrame f = new JFrame("PaintComponentTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setSize(dim.width * N, dim.height * (N + 1));
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new PaintComponentTest().display();
            }
        });
    }
}
国产ˉ祖宗 2024-12-17 11:08:24

正如其他人所评论的,Swing 组件支持 HTML 3.2 和基本样式。

有关如何在 paintComponent(Graphics) 方法中利用该功能的详细信息,请参阅 此线程

方法是将标签渲染到图像,然后将图像渲染到 Graphics 对象。

As others have commented, Swing components support HTML 3.2 and basic styles.

For details on how to leverage that ability in the paintComponent(Graphics) method, see the LabelRenderTest.java source on this thread.

The approach is to render the label to an image, then render the image to the Graphics object.

余罪 2024-12-17 11:08:24

您的问题的答案是不支持 HTML。

简单的解决方案是使用 Swing 组件并正确布局它们。

如果您想自己执行此操作,则需要操作用于 drawString() 方法的 Font。您可以使用斜体、粗体等字体。

The answer to your question is that HTML is not supported.

The easy solution is to use Swing components and lay them out properly.

If you want to do it yourself then you need to manipulate the Font that you use for the drawString() method. You can use a Font with italics, bold etc.

泪之魂 2024-12-17 11:08:24

我找到了一种简短而干净的方法来模拟 paintHtmlString;这是代码:

public class MyComponent extends JComponent {

    private JLabel label = null;

    public MyComponent() {
        super();
    }

    private JLabel getLabel() {
        if (label == null) {
            label = new JLabel();
        }
        return label;
    }

    /**
     * x and y stand for the upper left corner of the label
     * and not for the baseline coordinates ...
     */
    private void paintHtmlString(Graphics g, String html, int x, int y) {
        g.translate(x, y);
        getLabel().setText(html);
        //the fontMetrics stringWidth and height can be replaced by
        //getLabel().getPreferredSize() if needed
        getLabel().paint(g);
        g.translate(-x, -y);
    }

    protected void paintComponent(Graphics g) {
        //some drawing operations...
        paintHtmlString(g, "<html><u>some text</u></html>", 10, 10);
    }
}

感谢大家的帮助,我非常感激。

I've found a short and a clean way to simulate the paintHtmlString; here's the code:

public class MyComponent extends JComponent {

    private JLabel label = null;

    public MyComponent() {
        super();
    }

    private JLabel getLabel() {
        if (label == null) {
            label = new JLabel();
        }
        return label;
    }

    /**
     * x and y stand for the upper left corner of the label
     * and not for the baseline coordinates ...
     */
    private void paintHtmlString(Graphics g, String html, int x, int y) {
        g.translate(x, y);
        getLabel().setText(html);
        //the fontMetrics stringWidth and height can be replaced by
        //getLabel().getPreferredSize() if needed
        getLabel().paint(g);
        g.translate(-x, -y);
    }

    protected void paintComponent(Graphics g) {
        //some drawing operations...
        paintHtmlString(g, "<html><u>some text</u></html>", 10, 10);
    }
}

Thanks to every one for the help, I do appreciate that very much.

双马尾 2024-12-17 11:08:24

使用 JLabel 作为您的基类。 Graphics.drawString() 只能...绘制一个字符串。

Use JLabel as your base class. Graphics.drawString() can only... draw a string.

请帮我爱他 2024-12-17 11:08:24

这不是实现的方法。

drawString(String str, int x, int y) 仅使用此图形上下文的当前字体和颜色绘制指定字符串给出的文本。

您可以从这里获取有关您的问题的更多信息,如何在 Swing 中使用 HTML组件

This is not the way to implement.

The drawString(String str, int x, int y) only draws the text given by the specified string, using this graphics context's current font and color.

You can get more information for your problem from here, How to Use HTML in Swing Components

一抹淡然 2024-12-17 11:08:24

没有一种简单的方法来渲染 HTML 以使用 Graphics 进行绘制,请使用 JLabel。

然而,有一种有趣的方法可以通过使用 HTML 创建 JLabel 并将其图形绘制到组件来实现此目的:

private JLabel label;

public MyComponent() {
    label = new JLabel("Before Red");
    label.setText("<html><u>test</u></html>");
    this.add(label);
}

public void repaint(Graphics g){
    g = label.getGraphics();
}

实现此目的的最简单方法是为图形设置字体,例如:

public void repaint(Graphics g){    
    Font f = new Font("Courier", Font.BOLD, 12);
    g.setFont(f);
    g.drawString("Bolded Courier", 5, 15);
}

There isn't an easy way to render HTML to paint with Graphics, go with a JLabel.

However, there is an interesting way to accomplish this by creating a JLabel with HTML and painting it's graphics to the component:

private JLabel label;

public MyComponent() {
    label = new JLabel("Before Red");
    label.setText("<html><u>test</u></html>");
    this.add(label);
}

public void repaint(Graphics g){
    g = label.getGraphics();
}

The easiest way to accomplish this would be to set a font for your graphics, for example:

public void repaint(Graphics g){    
    Font f = new Font("Courier", Font.BOLD, 12);
    g.setFont(f);
    g.drawString("Bolded Courier", 5, 15);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文