Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 让JTextArea显示固定宽度字体而不进行抗锯齿_Java_Swing_Fonts_Cross Platform_Jtextarea - Fatal编程技术网

Java 让JTextArea显示固定宽度字体而不进行抗锯齿

Java 让JTextArea显示固定宽度字体而不进行抗锯齿,java,swing,fonts,cross-platform,jtextarea,Java,Swing,Fonts,Cross Platform,Jtextarea,有人知道如何让JTextArea显示一个固定的大小吗 所有平台上的字体 我想制作一个具有保存/打开功能的简单代码编辑器, 这很简单,但我想让字体 固定尺寸,最好是新的 问题是courier new显然是专有的,而不是 只是它不是默认安装在许多系统上,而是安装在大多数系统上 在现代系统中,它被设置为cleartype为默认值,这使得 看起来像垃圾 我很想用更新渲染绘制和 重新创建JTextArea,并将字体保存为固定大小的位图,但 这种方法看起来很愚蠢,而且非常耗时 我想包括一个免费的固定大小字体

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

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

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

我很想用更新渲染绘制和 重新创建JTextArea,并将字体保存为固定大小的位图,但 这种方法看起来很愚蠢,而且非常耗时

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

遗憾的是,Swing似乎自动遵守系统首选项 因此,在不破坏用户设置的情况下,这似乎是不可能的

简而言之,有没有办法让JTextArea显示一个固定的宽度 字体并禁用字体平滑/抗锯齿(或至少切换),或 使用swing无法完成此任务吗


提前谢谢

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

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

    }

}

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

我通过使用
JTextPane
而不是
JTextArea
JTextPane
的内容类型设置为
text/html
并将文本设置为
html
内容,接近解决方案

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>"                
        + "");
JtextPane textPane;
字符串文本;
//初始化
setContentType(“text/html”);
textPane.setText(“”)
+ ""
+ ""
+“”
+“+text.replaceAll(“,”).replaceAll(“\n”,“
”)+” +“

” + "" + "" + "");

标记使文本为单行
文本的所有空格和新行字符分别替换为html和

标记。我在Windows和Ubuntu操作系统中测试了输出,结果都是一样的

谢谢,这回答了这个问题,但我仍然很好奇,如果我能使单间距字体保证它不会抗锯齿。这可能吗?@Dmitry有几种方法可以禁用抗锯齿:1)System.property(“swing.aatext”、“false”);2) 您可以在
paintComponent
方法的
Graphics`对象上设置渲染提示,以禁用文本消除混叠(
((Graphics2D)g)。设置渲染提示(renderinghits.KEY\u TEXT\u消除混叠,Boolean.FALSE)
但您不能绝对保证以后不会有人更改它。我不担心后面的更改,我担心的是默认设置:)。非常感谢@Dmitry Small correction,不能对提示值使用
Boolean.FALSE
。使用
RenderingHints.VALUE\u TEXT\u ANTIALIAS\u OFF
。很抱歉。@Dmitry
JComboBox cb=new-JComboBox(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());JSpinner spinner=新JSpinner(新SpinnerNumberModel(12,4,240,1));JCheckBox italic=新的JCheckBox(“italic”);JCheckBox bold=新的JCheckBox(“bold”)在JPanel中添加所有这些代码,添加包装代码,就完成了。