Java Swing组件中老挝语文本的显示问题

Java Swing组件中老挝语文本的显示问题,java,swing,fonts,jlabel,Java,Swing,Fonts,Jlabel,我正在尝试显示老挝语文本: ຄິ້ງເຄັງສາຍພານ 在Java swing中的JLabel中,使用从获取的示例代码 选择的字体是DokChampa。但是,显示的文本是: 请注意,字母表上方的字符将移位并向右移动。但是,使用DokChampa字体在记事本或系统中的其他编辑器中输入的相同文本将正确显示 在JTextField中使用Windows支持的老挝语键盘输入数据时,行为相同 像LaoUI这样尝试过的其他字体在javaswing组件中也有相同的行为 使用JDK1.8.0_152。我的示例

我正在尝试显示老挝语文本:

ຄິ້ງເຄັງສາຍພານ

在Java swing中的
JLabel
中,使用从获取的示例代码

选择的字体是DokChampa。但是,显示的文本是:

请注意,字母表上方的字符将移位并向右移动。但是,使用DokChampa字体在记事本或系统中的其他编辑器中输入的相同文本将正确显示

JTextField
中使用Windows支持的老挝语键盘输入数据时,行为相同

像LaoUI这样尝试过的其他字体在javaswing组件中也有相同的行为

使用JDK1.8.0_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);
        }
    });
}
}
导入java.awt.Font;
导入java.awt.GraphicsEnvironment;
导入javax.swing.JLabel;
导入javax.swing.JOptionPane;
导入javax.swing.SwingUtilities;
公共类测试{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
JLabel=新的JLabel();
字符串[]lstr=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
Font[]fList=新字体[lstr.length];

对于(inti=0;i我有一个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;
    }
    
}
导入java.awt.BorderLayout;
导入java.awt.Font;
导入java.awt.GraphicsEnvironment;
导入java.awt.GridLayout;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.BorderFactory;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公共类TestLaos实现可运行{
公共静态void main(字符串[]args){
invokeLater(newtestlaos());
}
@凌驾
公开募捐{
JFrame=新的JFrame(“老挝字体”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
字符串rawString=新字符串(“ຄິ້ງເຄັງສາຍພານ");
List laosFonts=getLaosFonts(rawString);
frame.add(createMainPanel(laosFonts,rawString),BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
专用JPanel createMainPanel(列表laosFonts、字符串RawsString){
JPanel面板=新的JPanel(新的网格布局(0,2,10,10));
panel.setBorder(BorderFactory.createEmptyByOrder(10,10,10,10));
用于(字体:laosFonts){
JLabel label1=新的JLabel(font.getFontName());
label1.setFont(label1.getFont().deriveFont(Font.PLAIN,20f));
面板。添加(标签1);
JLabel label2=新的JLabel(原始字符串);
label2.setFont(font.deriveFont(font.PLAIN,20f));
面板。添加(标签2);
}
返回面板;
}
私有列表getLaosFonts(字符串rawString){
List laosFonts=new ArrayList();
Font[]list=GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
用于(字体:列表){
if(font.canDisplayUpTo(rawString)=-1){
laosFonts.add(字体);
}
}
返回老挝;
}
}

您使用的是什么JDK版本?JDK版本是1.8.0,用于添加MRE!OTOH a)并非所有电脑都安装了DokChampa字体,..b)代码显示相同(实际上)这里的行为使用Arial Unicode MS。使用1.8.0_261,我得到了类似的移位;JavaFX的结果类似;
stdout
上没有任何内容;Lucida Grande字体是Swing默认字体;NetBeans 8.2 editor显示移位,但BBEdit显示正确。@trashgod似乎有多种JRE(使用Swing或Java FX)有许多不同的字体将无法正确显示老挝文字。:(我猜问题在于Java,而不是字体。我在运行代码时得到[link]()。但是,Noto字体不显示非老挝文字(例如:ງ່າມປູ ເຂົ້າເລກ 1.ແລະ ເລກຖອຍ 33081/86 , 3309-1702026)这也包含数字数据。此外,我的系统上安装了DejaVu字体。有没有任何特定的原因使它们无法被提取?@Saumya:我发布的代码应该检索所有注册到本地图形环境的字体。谢谢你的评论,这让我开始研究这个线程。DejaVu字体是为当我为所有用户安装时,代码选择了DejaVu字体并正确显示了老挝文字。