gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:21:55 30 4
gpt4 key购买 nike

我正在尝试显示老挝语文本:
ຄິ້ງເຄັງສາຍພານ
JLabel在 Java Swing 中使用从 following link 获得的示例代码.
选择的字体是 DokChampa。但是,显示的文本是:
Sample screen-shot
请注意,字母上方的字符被移位并向右移动。但是,使用 DokChampa 字体在系统中的记事本或其他编辑器中输入的相同文本可以正确显示。
JTextField 中完成数据输入后也使用 Windows 支持的老挝语键盘,行为是相同的。
在 Java Swing 组件中尝试过的其他字体(如老 UI)也具有相同的行为
使用 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);
}
});
}
}

最佳答案

我有一个 Windows 10 操作系统。我正在使用 Oracle Java JDK 14.0.2 并编译为 Java 8 标准。
这是我的测试结果。
Laos Fonts
有些文字是正确的,有些则不是。我怀疑字体有问题。
这是我运行的代码。在您的系统上尝试一下,看看会发生什么。

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 - Java Swing 组件中老挝语文本的显示问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65456672/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com