让JTextArea显示固定宽度的字体而不使用抗锯齿

Dmi*_*try 10 java fonts swing cross-platform jtextarea

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

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

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

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

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

可悲的是,似乎Swing自动遵守系统首选项,因此在不破坏用户设置的情况下,它似乎是不行的.

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

提前谢谢!

Gui*_*let 26

您可以使用逻辑字体"monospaced".虽然它保证所有字符的字体大小相同,但在所有平台上都不一样.

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("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();
            }
        });

    }

}
Run Code Online (Sandbox Code Playgroud)

或者,您可以查找满足您需求的"免费"字体,将该字体嵌入代码并加载java.awt.Font.createFont(int, InputStream).

  • @Dmitry`JComboBox cb = new JComboBox(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames()); JSpinner spinner = new JSpinner(new SpinnerNumberModel(12,4,240,1)); JCheckBox italic =新的JCheckBox("Italic"); JCheckBox bold = new JCheckBox("Bold");`在JPanel中添加所有这些,添加包装代码就完成了. (3认同)
  • @Dmitry有多种方法可以禁用抗锯齿:1)[`System.setProperty("awt.useSystemAAFontSettings","false");`](http://docs.oracle.com/javase/6/docs/ technotes/guides/2d/flags.html#aaFonts) `System.property("swing.aatext", "false"); 2) 您可以在 `paintComponent` 方法的 `Graphics` 对象上设置 RenderingHints 以禁用 TEXT_ANTI_ALIASING (`((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, Boolean.FALSE);` 但您不会有绝对保证事后不会有人改变。 (2认同)