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

Ern*_*dis 5 java graphics fonts swing

A 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果我这样做g2d.setFont(new Font("Arial", Font.PLAIN, 12));- 日文字符不可见,只改为正方形:

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

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

And*_*son 7

它使用逻辑字体.SANS_SERIF将是Arial(主要)在Windows上.

在此输入图像描述

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);
    }
}
Run Code Online (Sandbox Code Playgroud)