Painting Japanese characters using Arial fonts using drawString (..) (Graphics2D)

A String can be drawn like this:

 @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(); } } 

The problem is that if I do g2d.setFont(new Font("Arial", Font.PLAIN, 12)); - Japanese characters are not visible, just squares:

enter image description here

And if I set the font as g2d.setFont(new Font("Serif", Font.PLAIN, 12)); - everything works fine:

enter image description here

For example, in MS WordPad, characters are visible if the Arial font is selected:

enter image description here

But I want to use the font Arial . Maybe I need to discover a Japanese character and switch to a different font, and then again?

+5
source share
1 answer

It works using logical fonts. SANS_SERIF will be Arial (primarily) on Windows.

enter image description here

 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); } } 
+7
source

Source: https://habr.com/ru/post/1214652/


All Articles