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

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

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

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

Я что-то забыл? Или нет моноширинного шрифта со значками?


person user28061    schedule 13.06.2012    source источник


Ответы (2)


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

<сильный>1. Вам нужен шрифт, который является моноширинным для всех символов Юникода, символов и т. д.

Согласно этой странице, существует 12886 буквенно-цифровых и "символьных" символов, определенных Стандарт Юникод 3.2. Unicode теперь равен 6.0, поэтому мы, вероятно, можем предположить, что теперь это число больше. Я также предполагаю, что «буквенно-цифровой» означает английские символы, потому что Unicode поддерживает более 100 000 символов, охватывающих многие языки. В любом случае, 12886 символов, распознаваемых на английском языке, — это все еще МНОГО, и я сомневаюсь, что есть много бесплатных шрифтов, поддерживающих их все.

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

<сильный>2. Этот моноширинный шрифт должен быть «кроссплатформенным».

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

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

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

person CodeBlind    schedule 13.06.2012
comment
С буквенными символами я имел в виду a-Z, 0-9 и т. д. Courier New работал нормально для меня. - person user28061; 13.06.2012
comment
Я рекомендую исходный код для хорошего бесплатного кроссплатформенного шрифта. Вам нужно будет либо включить его в свой установщик, либо ваши пользователи установят его вручную. github.com/adobe-fonts/source-code-pro/releases - person Appak; 02.12.2014

Моноширинный шрифт работает в 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;
  }
}

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

person Spyder    schedule 14.08.2012