1

我想生成与 JLabel 标签相同的文本图像而不显示 JLabel。

我尝试了相同的字体,相同的绘图方法。
但生成的图像与 JLabel 不同。

我的源代码如下。
* 'super.paintComponent(g)' 已经被注释掉了,因为它是相同的方式。输出图像相同。
* 下面通过“View.paint”方法绘制,但我也尝试过“SwingUtilities2.drawString”。两个结果是一样的。

    /* Label */
    JLabel label = new JLabel(text) {
        @Override
        public void paintComponent(Graphics g) {
            //super.paintComponent(g);
            View v = BasicHTML.createHTMLView(this, getText());
            v.paint(g, new Rectangle(0, 0, getWidth(), getFontMetrics(
                            getFont()).getAscent()));
        }
    };
    label.setFont(new Font("Consolas", Font.PLAIN, 13));

    /* Image */
    FontMetrics fm = label.getFontMetrics(font);
    BufferedImage image = new BufferedImage(fm.stringWidth(text),
                fm.getHeight(), BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = image.createGraphics();
    g2d.setFont(label.getFont());

    // Clear background.
    g2d.setPaint(label.getBackground());
    g2d.fillRect(0, 0, image.getWidth(), image.getHeight());

    // Draw string.
    g2d.setClip(new Rectangle(0, 0, image.getWidth(), image.getHeight()));
    View v = BasicHTML.createHTMLView(label, text);
    v.paint(g2d, new Rectangle(0, 0, image.getWidth(), 
            g2d.getFontMetrics().getAscent()));

    // ... output image to file ...

结果图像如下。
[JLabel]
在此处输入图像描述
[生成的图像]
在此处输入图像描述

与 JLabel 的捕获相比,生成的图像略显瘦脸。
如何生成与 JLabel 标签相同的文本图像?

谢谢您的考虑。

4

2 回答 2

2
  • BasicHTML.createView如果你想拥有一样的东西,你为什么要使用JLabel
  • 你可以JLabel直接使用(如果你只想要文本而不是背景,设置opaquefalseborderto null
  • 或者你可以使用g2d.drawString()
于 2012-09-25T10:44:24.797 回答
2

我不确定,但您可能需要创建兼容的缓冲图像(与显示器兼容)

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();

// Create an image that does not support transparency
BufferedImage bimage = gc.createCompatibleImage(100, 100, Transparency.OPAQUE);

这至少会让您接近用于渲染到屏幕的图形

您可能还想为渲染质量付出代价

Kleopatra 不久前就类似问题发表了一篇文章,您可能会尝试追捕它

于 2012-09-25T10:51:56.747 回答