GraphicsEnvironment.getAvailableFontFamilyNames() предоставляет нам массив всех установленных шрифтов. Однако на моем сайте не все шрифты правильно отображают текст; вместо этого в некоторых шрифтах отображаются только квадраты. Запустите приведенный ниже код, чтобы узнать, есть ли у вас «бесполезные» шрифты.
Теперь я хотел бы отсеять эти шрифты.
Это исправленная версия моего исходного опубликованного кода с решенной проблемой. Вся заслуга в комментариях принадлежит Хольгеру.
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.image.*;
import javax.swing.*;
public class FontsMany extends JFrame {
boolean first= true;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
Insets insets;
JScrollPane scroll;
String fontList[] = ge.getAvailableFontFamilyNames();
int count= fontList.length;
public FontsMany() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(640, 700);
setTitle(String.valueOf(fontList.length)+" installierte Fonts");
MyPanel mp= new MyPanel();
scroll = new JScrollPane(mp);
ScrollBarListener sbl= new ScrollBarListener();
scroll.getHorizontalScrollBar().addAdjustmentListener(sbl);
scroll.getVerticalScrollBar().addAdjustmentListener(sbl);
add(scroll, BorderLayout.CENTER);
setVisible(true);
}
// With "void main(String args[])" the frame was displayed twice.
public static void main(String args[]) {
EventQueue.invokeLater(FontsMany::new);
}
private int checkDisplayability(Font theFont, int iUndisplayable) {
if (theFont.canDisplay('A')) {
// 'z' is ASCII, Ā is beyond ISO-Latin-1.
int ind= theFont.canDisplayUpTo("zÀÿ"); // "zÀÿĀ"
if (ind>-1) {
System.console().printf("%s%s %s%n", "UpTo: ", ind, theFont.getName());
}
if (hasMissingGlyphs(theFont, "zÀÿ")) {
System.out.println("Missing glyph: " +theFont.getName());
iUndisplayable++;
}
}
else { // !theFont.canDisplay('A')
System.out.println(theFont.getName());
iUndisplayable++;
}
return iUndisplayable;
}
public boolean hasMissingGlyphs(Font font, String text) {
// Create a FontRenderContext. Using a buffered image avoids needing a visible
// component.
FontRenderContext frc = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)
.createGraphics().getFontRenderContext();
GlyphVector gv = font.createGlyphVector(frc, text);
for (int i = 0; i < gv.getNumGlyphs(); i++) {
int glyphCode = gv.getGlyphCode(i);
if (glyphCode == font.getMissingGlyphCode()) {
// glyph code 0 is usually the ".notdef" / missing glyph
return true;
}
}
return false;
}
class ScrollBarListener implements AdjustmentListener {
public void adjustmentValueChanged(AdjustmentEvent evt) {
scroll.repaint();
}
}
class MyPanel extends JPanel {
MyPanel() {
setPreferredSize(new Dimension(600, count/3*14));
}
public void paintComponent(Graphics g) {
if (insets == null) insets = getInsets();
g.translate(insets.left, insets.top);
Font theFont;
FontMetrics fm;
int fontHeight = 0;
int[] arr= new int[count];
int iend= count/3;
if (count%3 >0) iend++;
int idif= iend*2;
if (count%3 == 1) idif--;
int iUndisplayable= 0;
for (int i= 0; i
Подробнее здесь: https://stackoverflow.com/questions/798 ... as-squares
Как программно определить, отображает ли шрифт символы в виде квадратов? ⇐ JAVA
Программисты JAVA общаются здесь
1770912463
Anonymous
GraphicsEnvironment.getAvailableFontFamilyNames() предоставляет нам массив всех установленных шрифтов. Однако на моем сайте не все шрифты правильно отображают текст; вместо этого в некоторых шрифтах отображаются только квадраты. Запустите приведенный ниже код, чтобы узнать, есть ли у вас «бесполезные» шрифты.
Теперь я хотел бы отсеять эти шрифты.
Это исправленная версия моего исходного опубликованного кода с решенной проблемой. Вся заслуга в комментариях принадлежит Хольгеру.
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.image.*;
import javax.swing.*;
public class FontsMany extends JFrame {
boolean first= true;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
Insets insets;
JScrollPane scroll;
String fontList[] = ge.getAvailableFontFamilyNames();
int count= fontList.length;
public FontsMany() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(640, 700);
setTitle(String.valueOf(fontList.length)+" installierte Fonts");
MyPanel mp= new MyPanel();
scroll = new JScrollPane(mp);
ScrollBarListener sbl= new ScrollBarListener();
scroll.getHorizontalScrollBar().addAdjustmentListener(sbl);
scroll.getVerticalScrollBar().addAdjustmentListener(sbl);
add(scroll, BorderLayout.CENTER);
setVisible(true);
}
// With "void main(String args[])" the frame was displayed twice.
public static void main(String args[]) {
EventQueue.invokeLater(FontsMany::new);
}
private int checkDisplayability(Font theFont, int iUndisplayable) {
if (theFont.canDisplay('A')) {
// 'z' is ASCII, Ā is beyond ISO-Latin-1.
int ind= theFont.canDisplayUpTo("zÀÿ"); // "zÀÿĀ"
if (ind>-1) {
System.console().printf("%s%s %s%n", "UpTo: ", ind, theFont.getName());
}
if (hasMissingGlyphs(theFont, "zÀÿ")) {
System.out.println("Missing glyph: " +theFont.getName());
iUndisplayable++;
}
}
else { // !theFont.canDisplay('A')
System.out.println(theFont.getName());
iUndisplayable++;
}
return iUndisplayable;
}
public boolean hasMissingGlyphs(Font font, String text) {
// Create a FontRenderContext. Using a buffered image avoids needing a visible
// component.
FontRenderContext frc = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)
.createGraphics().getFontRenderContext();
GlyphVector gv = font.createGlyphVector(frc, text);
for (int i = 0; i < gv.getNumGlyphs(); i++) {
int glyphCode = gv.getGlyphCode(i);
if (glyphCode == font.getMissingGlyphCode()) {
// glyph code 0 is usually the ".notdef" / missing glyph
return true;
}
}
return false;
}
class ScrollBarListener implements AdjustmentListener {
public void adjustmentValueChanged(AdjustmentEvent evt) {
scroll.repaint();
}
}
class MyPanel extends JPanel {
MyPanel() {
setPreferredSize(new Dimension(600, count/3*14));
}
public void paintComponent(Graphics g) {
if (insets == null) insets = getInsets();
g.translate(insets.left, insets.top);
Font theFont;
FontMetrics fm;
int fontHeight = 0;
int[] arr= new int[count];
int iend= count/3;
if (count%3 >0) iend++;
int idif= iend*2;
if (count%3 == 1) idif--;
int iUndisplayable= 0;
for (int i= 0; i
Подробнее здесь: [url]https://stackoverflow.com/questions/79887779/how-to-programmatically-detect-whether-a-font-renders-characters-as-squares[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия