如何生成与JLabel标签相同的文本图像?

时间:2012-09-25 10:37:56

标签: java swing graphics

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

我尝试了相同的Font,相同的绘图方法 但生成的图像与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的]
enter image description here
[生成的图像]
enter image description here

与JLabel的捕获相比,生成的图像略微变薄 如何生成与JLabel标签相同的文本图像?

谢谢您的考虑。

2 个答案:

答案 0 :(得分:2)

  • 如果您希望与BasicHTML.createView相同,为什么要使用JLabel
  • 您可以直接使用JLabel(如果您只想要文字而非背景,请将opaque设为false,将border设为null
  • 或者您可以使用g2d.drawString()

答案 1 :(得分: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);

这至少可以让您在用于渲染到屏幕的图形时结束

您可能还想使用rendering quality付费

Kleopatra在一段时间前就类似的问题发了一篇文章,你可能会尝试追捕它