Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:塑造蒙古语字形时出错_Java_Swing_Javafx_Opentype - Fatal编程技术网

Java:塑造蒙古语字形时出错

Java:塑造蒙古语字形时出错,java,swing,javafx,opentype,Java,Swing,Javafx,Opentype,上下文:Java11、JavaFX11(如果适用)、LinuxMint19.3、Eclipse2020.06。Java应用程序作为桌面应用程序运行 背景:蒙古语脚本被认为是“复杂的”,为了正确塑造,需要OpenType表格,如isol,init,medi,fina,rlig,在实现它的字体中 我试图在JavaUI中插入蒙古语字符串,但在Swing和JavaFX中都得到了意想不到的结果 基本上,如果蒙古语字符串像“ᠪᠠᠢᠨ᠎ᠠ" 仅插入SwingJLabel或Fx标签中,渲染时不进行任何整形(或多

上下文:Java11、JavaFX11(如果适用)、LinuxMint19.3、Eclipse2020.06。Java应用程序作为桌面应用程序运行

背景:蒙古语脚本被认为是“复杂的”,为了正确塑造,需要OpenType表格,如
isol
init
medi
fina
rlig
,在实现它的字体中

我试图在JavaUI中插入蒙古语字符串,但在Swing和JavaFX中都得到了意想不到的结果

基本上,如果蒙古语字符串像“ᠪᠠᠢᠨ᠎ᠠ" 仅插入Swing
JLabel
或Fx
标签
中,渲染时不进行任何整形(或多或少与中相同)ᠪ ᠠ ᠢ ᠨ ᠠ),而如果在同一标签中添加了另一个“复杂”字符串中的字符串,则表示“अनुच्छेद ᠪᠠᠢᠨ᠎ᠠ“或”ᠪᠠᠢᠨ᠎ᠠ अनुच्छेद,则会正确渲染

此外,我注意到,在Swing中,Devanāgarī或阿拉伯语字符串的形状都是正确的,而在JavaFx中,Devanāgarī加法起作用,而阿拉伯语加法则不起作用

当然,我不能仅仅为了打开正确的整形而添加任意字符串。我是否忘记了一些重要的初始化,或者字体堆栈的Java整形层是否已损坏?(我想是HarfBuzz,它通常工作得很好…)

谢谢你的建议

Swing minimal示例,其中的注释显示哪些字符串正确呈现,哪些字符串不正确:

package com.vistamaresoft.swingtest;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Main
{
    private         JFrame      frame;
    private static  Main        window;

    public Main()
    {
        frame   = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setTitle("Mongolian Swing Test");
        frame.setBounds(100, 100, 300, 200);
        //Set up the GUI.
        JPanel      panel       = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        JLabel      label       = new JLabel("ᠪᠠᠢᠨ᠎ᠠ");         // NOT CORRECT
        panel.add(label);
        label                   = new JLabel("Abc ᠪᠠᠢᠨ᠎ᠠ");     // NOT CORRECT
        panel.add(label);
        label                   = new JLabel("ᠪᠠᠢᠨ᠎ᠠ  كتاب ");  // CORRECT
        panel.add(label);
        label                   = new JLabel("كتاب ᠪᠠᠢᠨ᠎ᠠ");        // CORRECT
        panel.add(label);
        label                   = new JLabel("ᠪᠠᠢᠨ᠎ᠠ अनुच्छेद");        // CORRECT
        panel.add(label);
        label                   = new JLabel("अनुच्छेद ᠪᠠᠢᠨ᠎ᠠ");        // CORRECT
        panel.add(label);
        frame.setContentPane(panel);
    }

    public static void main(String[] args)
    {
        window = new Main();
        window.frame.setVisible(true);
    }
}
JavaFx最小示例。请注意,
WebView
并不比
标签
更好,将标签文本复制并粘贴到HTML输入字段会产生相同的结果:

package com.vistamaresoft.fxtest;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class Main
{
    static final String html    = 
    "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n\"http://www.w3.org/TR/html4/strict.dtd\">\n" + 
    "<html>\n<body>\n" +
    "<p style='font-size: 18pt;'>Sample text: ᠴᠣᠴᠡᠭ᠎ᠠ</p>" +        // NOT CORRECT!
    "<p style='font-size: 18pt;'>ᠪᠠᠢᠨ᠎ᠠ كتاب </p>" +                // NOT CORRECT!
    "<p style='font-size: 18pt;'>अनुच्छेद ᠴᠣᠴᠡᠭ᠎ᠠ</p>" +                // CORRECT!
    "<p><input type='text' name='title' size='20' maxlength='50' style='font-size: 18pt;' /></p>" +
    "</body></html>\n";

    public static void main(String[] args)
    {
        Application.launch(MainApp.class, args);
    }

    public static class MainApp extends Application
    {
        @Override public void start(Stage primaryStage) throws Exception
        {
            WebView webView = new WebView();
            webView.getEngine().loadContent(html);
            Label   lab1    = new Label("ᠪᠠᠢᠨ᠎ᠠ");      // NOT CORRECT
            lab1.setStyle("-fx-font-size: 24pt;");
            Label   lab2    = new Label("ᠪᠠᠢᠨ᠎ᠠ كتاب"); // NOT CORRECT
            lab2.setStyle("-fx-font-size: 24pt;");
            Label   lab3    = new Label("كتاب ᠪᠠᠢᠨ᠎ᠠ"); // NOT CORRECT
            lab3.setStyle("-fx-font-size: 24pt;");
            Label   lab4    = new Label("ᠪᠠᠢᠨ᠎ᠠ अनुच्छेद"); // CORRECT
            lab4.setStyle("-fx-font-size: 24pt;");
            Label   lab5    = new Label("अनुच्छेद ᠪᠠᠢᠨ᠎ᠠ"); // CORRECT
            lab5.setStyle("-fx-font-size: 24pt;");
    
            VBox    vBox    = new VBox(webView, lab1, lab2, lab3, lab4, lab5);
            Scene   scene   = new Scene(vBox, 800, 600);
    
            primaryStage.setTitle("JavaFX Mongolian Test");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    }

}
package com.vistamaresoft.fxtest;
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.control.Label;
导入javafx.scene.layout.VBox;
导入javafx.scene.web.WebView;
导入javafx.stage.stage;
公共班机
{
静态最终字符串html=
“\n”+
“\n\n”+
“

ᠪᠠᠢᠨ᠎ᠠ “+//不正确! “