Получение JTextArea для отображения шрифта фиксированной ширины без сглаживания
Кто-нибудь знает, как заставить JTextArea отображать фиксированный размер
шрифт на всех платформах?
Я хочу создать простой редактор кода с функцией сохранения/открытия,
который достаточно прост, но я хотел бы, чтобы шрифт был
фиксированный размер, предпочтительно курьера нового.
Проблема в том, что курьерский новый, по-видимому, является собственностью, а не
только он не установлен по умолчанию во многих системах, но
современных систем, он будет установлен на cleartype по умолчанию, что делает
это похоже на мусор.
У меня возникает соблазн сделать мой собственный JPanel с помощью рендеринга-рендеринга и
изобретать JTextArea и сохранять шрифты в виде растровых изображений фиксированного размера, но
этот подход кажется глупым и очень трудоемким.
Я хотел бы включить бесплатный шрифт фиксированного размера в проект и
используйте этот шрифт на всех платформах, что представляется возможным. Однако,
современные системы, похоже, вынуждают - сглаживают все шрифты, которые я бы
как бы предотвратить это.
К сожалению, похоже, что Swing автоматически выполняет системные настройки
поэтому, не уничтожая пользовательские настройки, кажется, что это не выход.
Короче говоря, есть ли способ заставить JTextArea отображать фиксированную ширину
шрифт и отключить сглаживание/сглаживание шрифтов (или, по крайней мере, переключить), или
эта задача невозможна с помощью swing?
Спасибо заранее!
Ответы
Ответ 1
Вы можете использовать логический шрифт "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();
}
});
}
}
В качестве альтернативы вы можете найти "свободный" шрифт, который соответствует вашим потребностям, встроить этот шрифт в код и загрузить его с помощью java.awt.Font.createFont(int, InputStream)
.
Ответ 2
Я приблизился к решению, используя 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>"
+ "");
Тег <tt>
делает текст моноширинным, а все пробелы и новые строковые символы text
заменены на html пространственный объект и тег <br>
, соответственно. Я тестировал выход как в ОС Windows, так и в Ubuntu, и они были такими же.