Моноширинный шрифт/символы для JTextPane

Я хочу создать консольный вывод с помощью JTextPane. Поэтому я использую моноширинный шрифт:

textpane.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));

Это отлично подходит для всех типов букв (например, az, 0-9 и т.д.), но когда речь идет о символах типа "\u2588" (█), шрифт не моноширинный.

Я что-то забыл? Или нет моноширинного шрифта, который включает smybols?

Ответ 1

Хорошо, сначала это звучит для меня, как будто вы пытаетесь решить пару разных вещей здесь, поэтому я попытаюсь обратиться к ним обоим отдельно.

1. Вам нужен шрифт, который является моноширинным для всех символов юникода, символов или иным образом.

В соответствии с этой страницей было 12886 буквенно-числовых и символьных символов, определенных стандартом Unicode 3.2. Unicode теперь равен 6.0, поэтому мы можем предположить, что теперь число больше. Я также предполагаю, что "буквенно-цифровые" означает английские символы, потому что Unicode поддерживает более 100000 символов, охватывающих многие языки. Во всяком случае, 12886 символов и символов, признанных по-английски, по-прежнему много, и я сомневаюсь, что существует множество бесплатных шрифтов, которые поддерживают их всех.

Тем не менее, я в конечном итоге использую Courier New для большинства моих приложений Java, которым нужен шрифт с монослоем с поддержкой символов. Он поддерживает упомянутый выше символ "\ u2588", а также многие другие важные, такие как символ "градусов".

2. Этот шрифт с монослоем должен быть "кросс-платформенным"

Я точно знаю, что Mac OS X и все версии Windows поддерживают Courier New, а также версии Linux, которые я запускаю, тоже (RedHat... не помню номер версии), хотя не все версии Linux имеют этот шрифт изначально. В любом случае... вы можете попробовать Courier New и посмотреть, работает ли он на вас. Если нет, вы можете найти бесплатные инструменты онлайн для тестирования поддержки шрифтов/символов.

Заключительные мысли

Мне очень жаль это говорить, но я сомневаюсь, что есть много шрифтов, которые поддерживают все буквенно-цифровые/символьные символы, определенные стандартом Unicode, и, в меньшей степени, это одноразовые, кросс-платформенные и бесплатные. Если возможно, возможно, стоит потратить время на то, чтобы выяснить, какие символы вам понадобятся, а затем выбрать шрифт, который поддерживает эти символы, и, в свою очередь, поддерживается платформами, на которых вы будете запускать приложение. Если вам абсолютно необходима поддержка всех символов Unicode, к сожалению, это, вероятно, не будет бесплатным.

Ответ 2

Моноширинный шрифт работает на OS X, но не на Windows. Странно, что monospaced настроен на использование Courier New в Windows через fontconfig.properties.

Я действительно зарегистрировал это как ошибку с Oracle; вот пример кода, который корректно отображает OS X, но моноширинный шрифт создает квадратные квадратики в Windows.

import java.awt.BorderLayout;
import java.awt.Font;

import javax.swing.JEditorPane;
import javax.swing.JFrame;

public class Test {

    public static void main(String[] args) {
        JFrame f = new JFrame("editor test");
        f.getContentPane().setLayout(new BorderLayout());
        f.add(pane("monospaced"), BorderLayout.NORTH);
        f.add(pane("Courier New"), BorderLayout.SOUTH);
        f.pack();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

  private static JEditorPane pane(final String name) {
    JEditorPane p = new JEditorPane();
    final Font currFont = p.getFont();
    p.setFont(new Font(name, currFont.getStyle(), currFont.getSize()));
    p.setText(name + " - 8\u1d00.\u1d0d.");
    return p;
  }
}

Я попробовал добавить к нему u2588, и это отлично выглядит в OS X тоже.