等宽和UTF8

时间:2013-05-03 06:14:39

标签: java swing utf-8 monospace

我正在修改旧的Java Swing应用程序中的字体显示。 在运行时使用“ -Dfile.encoding = UTF-8 ”选项后更改。

FontClass.jar是我的示例jar文件。

option 1:
javaw -Xmx256M -jar -Dfile.encoding=UTF-8 "FontClass.jar"

option 2:
javaw -Xmx256M -jar "FontClass.jar"

使用选项1 我获得Monospaced显示

使用选项2:我获得非等宽显示。

限制:

i) -Dfile.encoding = UTF-8我们添加了这个选项,让我们所有的流都支持UTF-8。     坚持手动修改每个流。

ii)我们正在使用java swing框架和许多地方。我们是uisng默认字体。     改变这一切是很多工作。

所以现在我的问题是有任何命令行选项,我可以通过选项1获得Monospace显示:

以下是示例代码:

class Show extends Frame {
    FontMetrics fontM;
    String outString;

    Show(String target, String title, Font font) {

        setTitle(title);
        outString = target;

        fontM = getFontMetrics(font);
        setFont(font);

        int size = 0;
        for (int i = 0; i < outString.length(); i++) {
            size += fontM.charWidth(outString.charAt(i));
        }
        size += 24;

        setSize(size, fontM.getHeight() + 60);
        setLocation(getSize().width / 2, getSize().height / 2);
        setVisible(true);
    }

    public void paint(Graphics g) {
        Insets insets = getInsets();
        int x = insets.left;
        int y = insets.top;
        g.drawString(outString, x + 6, y + fontM.getAscent() + 14);
    }
}

public class Fontclass {

    public static void main(String[] args) { 



        String jaString = new String("\u65e5\u672c\u8a9e\u6587\u5b57\u5217");  

        String inputString = "\niiii\naaaaiiii";

        String displayString = jaString + " " + inputString;

        Font font;
        font = new Font("Courier",3, 24);

        new Show(displayString, "Demo",font);

    }
}

1 个答案:

答案 0 :(得分:1)

来自FontMetrics API,根据charWidth()定义 advance ,“请注意String的前进不一定是人物的进步。“此外,名为"Courier"的字体可能是等宽字体,但 可能与Font.MONOSPACED指定的字体相同。

相反,使用TextLayout派生所需的几何图形,如hereherehere所示。