13

有人知道如何让 JTextArea 在所有平台上显示固定大小的字体吗?

我想制作一个具有保存/打开功能的简单代码编辑器,这很简单,但我想让字体固定大小,最好是新的快递。

问题是 courier new 显然是专有的,不仅在许多系统上默认没有安装它,而且在大多数现代系统上,它被设置为 cleartype 为默认值,这使它看起来像垃圾。

我很想用 update-render-paint 制作自己的 JPanel 并重新发明 JTextArea,并将字体保存为固定大小的位图,但这种方法看起来很愚蠢,而且非常耗时。

我想在项目中包含一个免费的固定大小字体,并在所有平台上使用该字体,这似乎是可能的。然而,现代系统似乎强制平滑所有字体,我想阻止它这样做。

可悲的是,Swing 似乎自动遵守系统偏好,因此在不破坏用户设置的情况下,这似乎是不可行的。

所以简而言之,有没有办法让 JTextArea 显示一个固定宽度的字体并禁用字体平滑/抗锯齿(或至少切换),或者这个任务使用摇摆是不可能的?

提前谢谢!

4

2 回答 2

30

您可以使用逻辑字体“等宽”。虽然它保证所有字符都具有相同大小的字体,但在所有平台上都不会相同。

import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class TestTextArea {

    private void initUI() {
        JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTextArea textArea = new JTextArea(24, 80);
        textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
        frame.add(new JScrollPane(textArea));
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestTextArea().initUI();
            }
        });

    }

}

或者,您可以查找满足您需要的“免费”字体,将该字体与代码一起嵌入并使用java.awt.Font.createFont(int, InputStream).

于 2013-04-29T13:32:09.693 回答
1

JTextPane我通过使用而不是设置toJTextArea的内容类型并将文本设置为内容来接近解决方案。JTextPanetext/htmlhtml

JtextPane textPane;
String text;

// initialization

textPane.setContentType("text/html");
textPane.setText(""
        + "<html>"
        + "<body>"
        + "<p>"
        + "<tt>"+text.replaceAll(" ", "&nbsp;").replaceAll("\n", "<br>")+"</tt>"
        + "</p>"
        + "</body>"
        + "</html>"                
        + "");

<tt>标记使文本等宽 ,并且所有空格和换行符text已分别替换为 html空间实体<br>标记。我在 Windows 和 Ubuntu 操作系统中测试了输出,它们是相同的。

于 2016-02-18T18:45:11.593 回答