3

オブジェクトがあり、そのメソッドGraphics2Dを使用したい。drawStringそのメソッドを呼び出して、文字列と (x, y) の位置を渡すことができます。これは非常に便利です。ただし、Font オブジェクトを期待するメソッドGraphics2Dを使用して、オブジェクトのフォントを変更することもできます。setFontこれもとてもいいです。残念ながら、Font オブジェクトに複数のフォント テキストを定義するつもりなので、これでは十分ではありません。

これは、Font オブジェクトに転送したいテキスト表現です。

font-family:"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif

インターフェイスを使用して問題を解決できる可能性があることをAttributedCharacterIterator確認しましたが、どのように使用すればよいかわかりません。AttributedStringのセットを持つという実装が実際にあることを見てきましたが、オブジェクトが複数のフォントを認識して適用するように、 のコンストラクターで使用できるオブジェクトAttributesを作成する方法がわかりません。私が電話したとき。AttributedStringFontGraphics2DdrawString

編集:

    public static AttributedString getFontByAttributes(String atts, String value)
    {
        String[] attributes = atts.split(",");
        AttributedString attributedString = new AttributedString(value);
        for (int attributeIndex = 0; attributeIndex < attributes.length; attributeIndex++)
        {
            attributedString.addAttribute(TextAttribute.FONT, attributes[attributeIndex].trim());
        }
        return attributedString;
    }
//...
    public void drawTitle(Graphics2D g2d)
{
//...
        g2d.drawString(getFontByAttributes(Settings.titleFontString, Settings.title).getIterator(), Settings.headerWidthOffset, Settings.headerHeightOffset);
//...
}

上記のコードでは、このアプリケーションをテストしたシステムで知られている Andale Mono を使用して試しましたが、生成されたグラフィックスでは、テキストは Times New Roman フォントで描画されます。何かが間違っています。残念ながら、何が欠けているのかわかりません。

4

2 に答える 2

7

基本的に、AttributedStringレンダリング属性を に適用できるメソッドを提供しますString。本当に明らかなようです。

その後、レンダリングAttributedStringAttributedCharacterIteratorためににを渡すことができます...Graphics2D

ここに画像の説明を入力

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.LineMetrics;
import java.awt.font.TextAttribute;
import java.text.AttributedString;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestAttributedString {

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

    public TestAttributedString() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            AttributedString text = new AttributedString("Bunny rabits and flying ponies");
            text.addAttribute(TextAttribute.FONT, new Font("Arial", Font.BOLD, 24), 0, "Bunny rabits".length());
            text.addAttribute(TextAttribute.FOREGROUND, Color.RED, 0, "Bunny rabits".length());

            text.addAttribute(TextAttribute.FONT, new Font("Arial", Font.BOLD & Font.ITALIC, 32), 17, 17 + "flying ponies".length());
            text.addAttribute(TextAttribute.FOREGROUND, Color.BLUE, 17, 17 + "flying ponies".length());

            FontMetrics fm = g2d.getFontMetrics();
            LineMetrics lm = fm.getLineMetrics(text.getIterator(), 0, text.getIterator().getEndIndex(), g);

            g2d.drawString(text.getIterator(), 0, (int)lm.getAscent() + lm.getHeight());
            g2d.dispose();
        }
    }

}

詳細については、これを確認できます

于 2013-04-17T00:04:05.517 に答える
4

Graphics2D には、drawString(AttributedCharacterIterator, int, int)使用したいメソッドがあります。

TextAttribute.FONT文字列の特定のサブ範囲ごとに必要なすべての異なるプロパティを使用して AttributedString を作成し、次を呼び出すだけです。

g2d.drawString(myAttributedString.getIterator(), x, y);
于 2013-04-16T23:49:18.313 に答える