java graphics2d 写入文字_如何指定Java2D/Graphics2D中的后备字体

我们可以将字符串属性设置为在“坏”符号上切换字体,并使用Graphics2D.drawString(AttributedCharacterIterator iterator, int x, int y)来渲染结果。 优点:这将适用于任何字体。 缺点:如果没有某种缓存中间对象,这将工作得更慢更脏。

所以,我建议使用AttributedString对整个字符串的主要字体属性:

AttributedString astr = new AttributedString(text);

astr.addAttribute(TextAttribute.FONT, mainFont, 0, textLength);

,并与特定部分备用字体:

astr.addAttribute(TextAttribute.FONT, fallbackFont, fallbackBegin, fallbackEnd);

渲染本身:

g2d.drawString(astr.getIterator(), 20, 30);

结果(物理“Segoe打印”作为主要字体,逻辑“Serif”作为后备):

70386a63f571a44562a7bf6f8f89330e.png

完全应该将要-SSCCE代码:

import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.font.TextAttribute;

import java.text.AttributedString;

import javax.swing.JComponent;

import javax.swing.JFrame;

public class FontTest extends JFrame {

public FontTest() {

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

getContentPane().setLayout(new BorderLayout());

getContentPane().add(new TestStringComponent());

pack();

}

public static void main(String[] args) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new FontTest().setVisible(true);

}

});

}

}

class TestStringComponent extends JComponent {

protected void paintComponent(Graphics g) {

Graphics2D g2d = (Graphics2D) g;

g.setColor(getBackground());

g.fillRect(0, 0, getWidth(), getHeight());

g.setColor(getForeground());

Font mainFont = new Font("Segoe Print", Font.PLAIN, 25);

Font fallbackFont = new Font("Serif", Font.PLAIN, 25);

String s = "Test 漢鼎繁古印 Test 漢鼎繁古印 Test";

g2d.drawString(createFallbackString(s, mainFont, fallbackFont).getIterator(), 20, 30);

}

public Dimension getPreferredSize() {

return new Dimension(500, 40);

}

private AttributedString createFallbackString(String text, Font mainFont, Font fallbackFont) {

AttributedString result = new AttributedString(text);

int textLength = text.length();

result.addAttribute(TextAttribute.FONT, mainFont, 0, textLength);

boolean fallback = false;

int fallbackBegin = 0;

for (int i = 0; i < text.length(); i++) {

boolean curFallback = !mainFont.canDisplay(text.charAt(i));

if (curFallback != fallback) {

fallback = curFallback;

if (fallback) {

fallbackBegin = i;

} else {

result.addAttribute(TextAttribute.FONT, fallbackFont, fallbackBegin, i);

}

}

}

return result;

}

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值