Получение 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(" ", "&nbsp;").replaceAll("\n", "<br>")+"</tt>"
        + "</p>"
        + "</body>"
        + "</html>"                
        + "");
Тег

<tt> делает текст моноширинным, а все пробелы и новые строковые символы text заменены на html пространственный объект и тег <br>, соответственно. Я тестировал выход как в ОС Windows, так и в Ubuntu, и они были такими же.