使用Arial字体和drawString(..)方法(Graphics2D)绘制日语字符

5

String可以像这样绘制:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g.create();

    try {

        g2d.setColor(Color.BLACK);

        g2d.setFont(new Font("Serif", Font.PLAIN, 12));//Japanese characters are visible
        //g2d.setFont(new Font("Arial", Font.PLAIN, 12));//Japanese characters are not visible (squares only)

        g2d.drawString("Berryz工房 『ROCKエロティック』(Berryz Kobo[Erotic ROCK]) (MV)", 10, 45);

    } finally {
        g2d.dispose();
    }
}

问题在于,如果我使用g2d.setFont(new Font("Arial", Font.PLAIN, 12));,那么日文字符将无法显示,而只会显示方块符号:

enter image description here

如果我像这样设置字体:g2d.setFont(new Font("Serif", Font.PLAIN, 12));,一切都正常:

enter image description here

例如,在MS WordPad中,如果选择Arial字体,则可以看到字符:

enter image description here

但是我想要使用Arial字体。也许我需要检测日语字符并切换到不同的字体,然后再切回来?

Arial Unicode应该能够绘制片假名,但它不便宜:D。关于你的WordPad示例:如果我使用Word,则会切换到MS Gothic用于片假名/汉字,并使用Arial用于其他字符。 - Tom
3
您可能需要使用Font.canDisplayUpTo(String)方法来检查Arial字体可以显示到哪里,然后切换到日文字体并重复此步骤,直到整个字符串都被写入。当所选字体无法渲染字符时,Wordpad和MS Word会回退到某些默认字体来显示某些类型的脚本。 - nhahtdh
是的,Font.canDisplayUpTo(String)会有所帮助,但如何实现呢.. :) 又是一个难题,但至少是有可能的。Arial Unicode - 可能很好,但允许它随商业应用程序一起发布需要多少费用呢?.. - Ernestas Gruodis
1
尝试使用new Font(Font.SANS_SERIF, Font.PLAIN, 12)代替new Font("Arial", Font.PLAIN, 12),在Windows系统上应该会显示为Arial字体。 - Andrew Thompson
太好了! :) 现在我可以看到Arial字体,日语字符也可见。我想它不仅适用于Windows系统? - Ernestas Gruodis
“我猜它不仅在Windows上能用吧?” “不是的。逻辑字体的好处就在于此。例如,在OS X上,它将使用另一种无装饰的无衬线字体,如Helvetica,并使用任何其他本地字体来处理该无衬线字体未覆盖的任何脚本。” - Andrew Thompson
1个回答

7

它使用逻辑字体工作。SANS_SERIF在Windows上主要是Arial。

输入图像描述

import java.awt.*;
import javax.swing.*;

public class FontTestWithJapaneseCharacters {

    private JComponent ui = null;

    class PaintingSurface extends JPanel {

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

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            g2d.setColor(Color.BLACK);
            g2d.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12));
            g2d.drawString("Berryz工房 『ROCKエロティック』"
                    + "(Berryz Kobo[Erotic ROCK]) (MV)", 10, 15);
        }
    }

    FontTestWithJapaneseCharacters() {
        initUI();
    }

    public void initUI() {
        if (ui != null) {
            return;
        }

        ui = new PaintingSurface();
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(
                            UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                FontTestWithJapaneseCharacters o
                        = new FontTestWithJapaneseCharacters();

                JFrame f = new JFrame("Font test with Japanese characters");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

很想知道它在其他平台上的表现如何。非常感谢您的帮助。 - Ernestas Gruodis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接