【问题标题】:Problem with display of Lao text in Java Swing ComponentsJava Swing 组件中老挝语文本的显示问题
【发布时间】:2020-12-26 13:03:16
【问题描述】:

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

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

在Java swing 中的JLabel 中使用从following link 获得的示例代码。

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

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

当使用 Windows 支持的老挝语键盘在 JTextField 中完成数据输入时,行为是相同的。

其他类似LaoUI 的字体在Java Swing 组件中也有同样的行为

使用 JDK 1.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);
        }
    });
}
}

【问题讨论】:

  • 还有你用的是什么JDK版本?
  • JDK版本为1.8.0_152
  • 添加 MRE 的不错! OTOH a) 并非所有 PC 都会安装 DokChampa 字体,并且.. b) 代码在此处使用 Arial Unicode MS 显示相同的(实际上是 even worse)行为。
  • 使用 1.8.0_261,我得到了类似的转移 image;与 JavaFX 类似的结果; stdout 上什么都没有; Lucida Grande 字体为 Swing 默认; NetBeans 8.2 编辑器显示偏移,但 BBEdit 显示正确。
  • @trashgod 似乎具有多种不同字体的各种 JRE(使用 Swing 或 Java-FX)无法正确显示老挝字形。 :( 我猜问题出在 Java 上,而不是字体。

标签: java swing fonts jlabel


【解决方案1】:

我有一个 Windows 10 操作系统。我正在使用 Oracle Java JDK 14.0.2 并编译为 Java 8 标准。

这是我的测试结果。

有些文字是正确的,有些则不是。我怀疑字体有问题。

这是我运行的代码。在您的系统上尝试一下,看看会发生什么。

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;
    }
    
}

【讨论】:

  • 我在运行您的代码时得到 [link] (drive.google.com/file/d/1KqobL3KW2wTh7XAi5ILWiIa-4hcakobV/…)。但是,Noto 字体不显示包含数字数据的非老挝文本(例如:ງ່າມປູ ເຂົ້າເລກ 1 ແລະ ເລກຖອຍ 33081/86、3309-1702026)。此外,我的系统上安装了 DejaVu 字体。有什么具体原因不会被接走吗?
  • @Saumya:我发布的代码应该检索注册到本地图形环境的所有字体。
  • 感谢您的评论,这使我在 SO 上查看了此线程。 stackoverflow.com/questions/55264642/… DejaVu 字体已为当前用户安装。当我为所有用户安装它时,代码选择了 DejaVu 字体并正确显示了老挝文本。
猜你喜欢
  • 2019-05-27
  • 1970-01-01
  • 2013-10-24
  • 2016-12-14
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多