Java 让JTextArea显示固定宽度字体而不进行抗锯齿
有人知道如何让JTextArea显示一个固定的大小吗 所有平台上的字体 我想制作一个具有保存/打开功能的简单代码编辑器, 这很简单,但我想让字体 固定尺寸,最好是新的 问题是courier new显然是专有的,而不是 只是它不是默认安装在许多系统上,而是安装在大多数系统上 在现代系统中,它被设置为cleartype为默认值,这使得 看起来像垃圾 我很想用更新渲染绘制和 重新创建JTextArea,并将字体保存为固定大小的位图,但 这种方法看起来很愚蠢,而且非常耗时 我想包括一个免费的固定大小字体的项目和 在所有平台上使用该字体,这似乎是可能的。然而, 现代系统似乎会强制平滑所有字体,我想 我喜欢阻止它这样做 遗憾的是,Swing似乎自动遵守系统首选项 因此,在不破坏用户设置的情况下,这似乎是不可能的 简而言之,有没有办法让JTextArea显示一个固定的宽度 字体并禁用字体平滑/抗锯齿(或至少切换),或 使用swing无法完成此任务吗Java 让JTextArea显示固定宽度字体而不进行抗锯齿,java,swing,fonts,cross-platform,jtextarea,Java,Swing,Fonts,Cross Platform,Jtextarea,有人知道如何让JTextArea显示一个固定的大小吗 所有平台上的字体 我想制作一个具有保存/打开功能的简单代码编辑器, 这很简单,但我想让字体 固定尺寸,最好是新的 问题是courier new显然是专有的,而不是 只是它不是默认安装在许多系统上,而是安装在大多数系统上 在现代系统中,它被设置为cleartype为默认值,这使得 看起来像垃圾 我很想用更新渲染绘制和 重新创建JTextArea,并将字体保存为固定大小的位图,但 这种方法看起来很愚蠢,而且非常耗时 我想包括一个免费的固定大小字体
提前谢谢 您可以使用逻辑字体“等距”。虽然它保证所有字符的字体大小都相同,但并非所有平台上的字体都相同
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(" ", " ").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
。很抱歉。@DmitryJComboBox cb=new-JComboBox(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());JSpinner spinner=新JSpinner(新SpinnerNumberModel(12,4,240,1));JCheckBox italic=新的JCheckBox(“italic”);JCheckBox bold=新的JCheckBox(“bold”)代码>在JPanel中添加所有这些代码,添加包装代码,就完成了。