3

我有一个Graphics2D对象,我想使用它的drawString方法。我可以调用该方法并传递一个字符串和 (x, y) 位置,这非常好。但是,我也可以使用需要 Font 对象Graphics2DsetFont方法来更改对象的字体。这也很好。不幸的是,这对我来说还不够,因为我打算为我的 Font 对象定义多个字体文本。

这是我想转移到我的 Font 对象的文本表示:

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

我已经看到我可以使用该AttributedCharacterIterator界面来解决我的问题,但是,我不确定应该如何使用它。我已经看到实际上有一个名为 的实现,它AttributedString有一组当我打电话给他们时。AttributesAttributedStringFontGraphics2DdrawString

编辑:

    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. 看起来真的很明显。

之后,您可以将AttributedString's传递AttributedCharacterIterator给以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 回答