Я занимаюсь разработкой приложения 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 (̌), с использованием моноширинного шрифта.
Большое спасибо за то, что прочитали это и за вашу помощь.