javaswing组件中lao文本的显示问题

7tofc5zh  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(400)

我正在尝试显示老挝语文本:
ຄິ້ງເຄັງສາຍພານ
在一个 JLabel 在JavaSwing中使用从以下链接获得的示例代码。
选择的字体是dokchampa。但是,显示的文本是:

请注意,字母表上方的字符将被移位并向右移动。但是,在记事本或系统中使用dokchampa字体的其他编辑器中输入的相同文本将正确显示。
当数据输入在 JTextField 同样使用windows支持的lao键盘,行为也是相同的。
像laoui这样的其他字体在javaswing组件中也有相同的行为
使用jdk 1.8.0\u 152。我的示例程序如下。预期的输出是看到如上所述显示的文本。

import java.awt.Font;
import java.awt.GraphicsEnvironment;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class TestLaos {

public static void main(String[] args) {
    SwingUtilities.invokeLater( new Runnable() {
        public void run() {
            JLabel l = new JLabel();
            String [] lstr = GraphicsEnvironment.getLocalGraphicsEnvironment ().getAvailableFontFamilyNames();
            Font [] fList = new Font [lstr.length];
            for (int i = 0; i <lstr.length; i ++)
            {
             fList [i] = new Font (lstr [i], Font.PLAIN, 20);
            }
            String rawString = new String("ຄິ້ງເຄັງສາຍພານ");
            l.setText(rawString);
            Font f = l.getFont ();
            if (f.canDisplayUpTo (rawString)!=-1)
            {//Find fonts that can not be displayed, then find available fonts
                for (int i = 0; i <fList.length; i ++)
                {
                    if (fList [i] .canDisplayUpTo (rawString) ==-1 && fList [i].getFontName().startsWith("DokChampa"))
                    {
                        System.out.println("Using font " + fList [i].getFontName() + " to display " + rawString);
                        l.setFont (fList [i]);
                        break;
                    }
                }
            }

            JOptionPane.showMessageDialog(null, l);
        }
    });
}
}
tp5buhyn

tp5buhyn1#

我有一个windows10操作系统。我使用的是oraclejavajdk14.0.2,并编译为java8标准。
这是我的测试结果。

有些课文是正确的,有些是不正确的。我怀疑字体有问题。
这是我运行的代码。在你的系统上试试,看看会发生什么。

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestLaos implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new TestLaos());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Laos Fonts");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String rawString = new String("ຄິ້ງເຄັງສາຍພານ");
        List<Font> laosFonts = getLaosFonts(rawString);
        frame.add(createMainPanel(laosFonts, rawString), BorderLayout.CENTER);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createMainPanel(List<Font> laosFonts, String rawString) {
        JPanel panel = new JPanel(new GridLayout(0, 2, 10, 10));
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        for (Font font : laosFonts) {
            JLabel label1 = new JLabel(font.getFontName());
            label1.setFont(label1.getFont().deriveFont(Font.PLAIN, 20f));
            panel.add(label1);

            JLabel label2 = new JLabel(rawString);
            label2.setFont(font.deriveFont(Font.PLAIN, 20f));
            panel.add(label2);
        }

        return panel;
    }

    private List<Font> getLaosFonts(String rawString) {
        List<Font> laosFonts = new ArrayList<>();
        Font[] list = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();

        for (Font font : list) {
            if (font.canDisplayUpTo(rawString) == -1) {
                laosFonts.add(font);
            }
        }

        return laosFonts;
    }

}

相关问题