我的PC上安装了一个名为“BMW1”的自定义字体。我正在尝试遍历此字体中的所有条目并将其显示在JTextArea中。
我有以下代码:
JTextArea displayArea = new JTextArea();
Font font = new Font("BMW1", Font.PLAIN, 72);
displayArea.setFont(font);
String sample = "";
for (int current = 0; current < 300; current++)
sample += new Character((char)current).toString() + "\n";
displayArea.setText(sample);
当我运行我的程序时,它只打印出那些小盒子(我假设它意味着找不到该迭代的字体条目)。
我在这里做错了吗? JTextArea是这类东西的最佳选择吗?有关如何做到这一点的任何建议吗?
答案 0 :(得分:1)
我不确定我能给你一个完整的答案 - 但代码中的循环是错误的。
String sample = "";
for (int current = 0; current < 300; current++)
sample += new Character((char)current).toString() + "\n";
将'current'转换为'char'将创建一个'char',表示'current'的ASCII值。 ASCII表格中的前27个字符是不可打印的 - 所以这可能就是你的盒子的原因。
尝试从65到90('A' - 'Z')开始查看它是否有效。
答案 1 :(得分:1)
查看Font.canDisplay(...)方法,以帮助您确定是否可以使用您的字体。
我为此目的使用了JTextArea。
这是一个简单的演示,列出了您机器上可用的字体:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;
public class ComboBoxFonts extends JFrame implements ItemListener
{
JTextArea textArea;
JComboBox comboBox;
public ComboBoxFonts()
{
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();
Font [] fonts = ge.getAllFonts ();
comboBox = new JComboBox( fonts );
comboBox.setRenderer( new MyFontRenderer() );
comboBox.addItemListener( this );
getContentPane().add( comboBox, BorderLayout.SOUTH );
textArea= new JTextArea("Some text", 3, 20);
getContentPane().add( new JScrollPane( textArea ) );
}
public void itemStateChanged(ItemEvent e)
{
Font font = (Font)e.getItem();
textArea.setFont( font.deriveFont( textArea.getFont().getSize2D() ) );
comboBox.setFont( font.deriveFont( comboBox.getFont().getSize2D() ) );
}
public static void main(String[] args)
{
ComboBoxFonts frame = new ComboBoxFonts();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
class MyFontRenderer extends BasicComboBoxRenderer
{
public Component getListCellRendererComponent(
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
Font font = (Font)value;
setFont( font.deriveFont(12.0f) );
setText( font.getName() );
return this;
}
}
}
答案 2 :(得分:0)
使用Font canDisplay()方法确定Java无法显示此字体。
我最终切换到C#,它更好地支持自定义字体(至少在这种特殊情况下)。