Как программно определить, отображает ли шрифт символы в виде квадратов?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как программно определить, отображает ли шрифт символы в виде квадратов?

Сообщение 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

Подробнее здесь: https://stackoverflow.com/questions/798 ... as-squares
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»