1

JLabel を表示せずに、JLabel ラベルと同じテキスト画像を生成したいと考えています。

同じフォント、同じ描画方法を試しました。
ただし、生成されるイメージは JLabel と同じではありません。

私のソースコードは以下です。
* 'super.paintComponent(g)' は、同じ方法であることを明確にするためにコメント アウトされています。出力イメージは同じです。
※以下View.paintメソッドによる描画ですが、SwingUtilities2.drawStringも試してみました。2 つの結果は同じです。

    /* 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(背景ではなくテキストのみが必要な場合は、opaquetofalseおよびbordertoに設定します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);

これにより、少なくとも、画面へのレンダリングに使用されたグラフィックスに近づくことができます

レンダリング品質にもお金を払うこともできます

クレオパトラは少し前に同様の質問に投稿しました。

于 2012-09-25T10:51:56.747 に答える