Как автоматически выбрать шрифт, который может отображать предоставленный текст в javafx? - PullRequest
3 голосов
/ 11 апреля 2019

Я занимаюсь разработкой приложения JavaFX. Частично это виртуальная клавиатура, которая должна иметь возможность отображать символы, которые могут отсутствовать в шрифте по умолчанию . Мне нужно иметь возможность определять, когда символы не поддерживаются шрифтом JavaFX.

Моя первоначальная идея состояла в том, чтобы использовать метод java.awt.Font#canDisplayUpTo и искать во всех доступных шрифтах, используя GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(), и таким образом получить имя шрифта для создания JavaFX javafx.scene.text.Font.

Оказывается, что java.awt.Font#canDisplayUpTo возвращает -1 (что означает, что поддерживаются все символы), даже если производный шрифт JavaFX не поддерживает предоставленную строку. Я думаю, что это вызвано тем фактом, что java.awt.Font фактически поддерживается составным шрифтом при использовании шрифта по умолчанию - по крайней мере, это то, что я вижу, когда отлаживаю свой код.

private static Font defaultFont = Font.getDefault();
public String getFontName(String text) {
        //try default font
        java.awt.Font defaultFontAwt = new java.awt.Font(defaultFont.getName(), java.awt.Font.PLAIN, 16); //defaultFont.getFamily() produces the same result
        if (defaultFontAwt.canDisplayUpTo(text) == -1) {
            //this is always the case :(
            return defaultFont.getName();
        }
        //search through all available fonts
        GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
        java.awt.Font[] fonts = e.getAllFonts();
        for (java.awt.Font font : fonts) {
            if (font.canDisplayUpTo(text) == -1) {
                return font.getName();
            }
        }
        //Failed to find font that is able to display text
        return defaultFont.getName();
    }

Мой подход кажется ошибочным, поскольку defaultFontAwt - это составной шрифт, содержащий больше, чем defaultFont. Мне кажется, что я не могу просто создать java.awt.Font из javafx.scene.text.Font и наоборот.

Есть ли другой способ обнаружения неподдерживаемых символов с помощью javafx.scene.text.Font (желательно без использования AWT)? Если нет, то возможно ли не создать составной java.awt.Font из шрифта javafx по умолчанию?

Я столкнулся с этой проблемой при запуске моего приложения на моем arch linux и отображении мертвых символов, таких как dead caron (̌), с использованием моноширинного шрифта.

Большое спасибо за то, что прочитали это и за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...