2016-02-29 56 views
1

这个answer表明使用常量Font.SERIFFont.SANS_SERIF给出系统的默认字体。那没问题;但如果我有一个由系统的所有字体名称填充的JComboBox<String> - 那么如何正确设置JComboBox#setSelectedItem为系统默认字体?!如何将系统默认字体设置为JComboBox <String>的选定项目?

我想:setSelectedItem(Font.SANS_SERIF);setSelectedItem(Font.SERIF);JComboBox总是选择通过GraphicsEnvironment返回的字体列表中的第一个字体名称,而不是系统默认字体。

SSCCE:

import java.awt.*; 
import javax.swing.*; 

public class FontsExample extends JFrame { 

    JComboBox<String> combo_fonts; 
    GraphicsEnvironment ge; 

    public FontsExample() { 

     combo_fonts = new JComboBox<String>(); 

     ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 

     for (Font font : ge.getAllFonts()) { 
      combo_fonts.addItem(font.getFontName()); 
     } 

     combo_fonts.setSelectedItem(Font.SANS_SERIF); 

     JPanel panel = new JPanel(); 
     panel.add(combo_fonts); 

     add(panel); 

     setSize(300, 300); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       FontsExample fontsExample = new FontsExample(); 
      } 
     }); 
    } 
} 
+0

你期望列表选择什么?它实际上是否包含字体名称“SansSerif”或“Serif”?从我的测试似乎工作得很好 – MadProgrammer

+0

@MadProgrammer - 所选项目始终是“代理FB” - 这不是我的系统默认值。 “Agency FB”是通过'GraphicsEnvironment'返回的字体列表的第一项 - 这就是为什么它被选中 - 而不是因为使用'JComboBox#setSelectedItem' - 如果我删除'setSelectedItem'行 - 它给出相同的字体“机构FB” –

回答

2

似乎逻辑字体不那些由getAllFonts()返回中上市。另一方面,这是有效的。

ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    combo_fonts = new JComboBox<String>(ge.getAvailableFontFamilyNames()); 
    combo_fonts.setSelectedItem(Font.SANS_SERIF); 
+0

谢谢;您的解决方案按需要工作。我还尝试了另一种解决方案,同时仍然使用'getAllFonts()':在添加字体的循环中 - 我使用'font.getFamily()'而不是'font.getFontName()' –

相关问题