如何允许用户使用JComboBox在JTextPane中更改其字体?

我发现当谈到JTextPanes的主题时,缺乏互联网上有用的文档/教程。 我正在尝试做一个简单的文本处理器,我希望它能够从JComboBox中选择一个字体系列,该字体系列根据用户在其系统上安装的字体填充自己。 但是,无论我尝试什么样的实验,我都无法弄清楚如何让它发挥作用。

我所拥有的是一个基于JTextPane构建的工具栏类。 目前,它有一堆样式按钮,用于设置对齐和粗体,斜体和下划线。

这是我的代码:

/** * The StyleBar is used to customize styles in a Styled Document. It will take a * JTextPane as an argument for its constructor and then all actions to be taken * will affect the text in it. * * @author Andrew */ public class StyleBar extends JToolBar { private JLabel fontLbl; private JComboBox fontBox; // ...Irrelevant stuff to the problem at hand. /** * The initEvents method is used to initialize the necessary events for the * tool bar to actually do its job. It establishes the focus listener to the * buttons on the bar, and gives each one its individual functionality. It * also establishes the Font Selection interface. */ public void initEvents() { //For each item in the tool bar, add the focus listener as well as the //formatting listeners: boldFormat.addActionListener(new StyledEditorKit.BoldAction()); //boldFormat is boldFormat.addActionListener(resetFocus); //a JButton //Ditto for my italicsFormat and underlineFormat button(s) in the toolbar leftAlign.addActionListener(new StyledEditorKit.AlignmentAction(null, StyleConstants.ALIGN_LEFT)); leftAlign.addActionListener(resetFocus); //This listener just resets focus //back onto the TextPane. //Ditto for my right and centerAlign buttons //Set up the Font list, and add a listener to the combo box buildFontMenu(); } /** * The buildFontMenu detects all of the SYstem's available fonts and adds * them to the Font Selection box. */ public void buildFontMenu(){ GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); final String[] fontNames = ge.getAvailableFontFamilyNames(); for (int i = 0; i < fontNames.length; i++){ //What do I do here to take the entry at String[i] and make it so that when //the user selects it it sets the font Family in a similar way to that of //pressing the boldFormat button or the leftAlign button? } } //Everything else is irrelevant 

总结一下我的问题:我不知道如何正确地将侦听器设置为ComboBox,以便a)它对所选择的单个字体敏感,并且b)以某种方式使用StyledEditorKit.FontFamilyAction使生活更轻松?

斜线,如果我以错误的方式接近这个,我很想听到正确的方法。 正如我所说,我在互联网上的消息来源在这个问题上并不十分清楚。

非常感谢!

StyledEditorTestAction放在JToolBar ,但想法是一样的。 另见Charles Bell的HTMLDocumentEditor , 这里提到。 例如,

 bar.add(new StyledEditorKit.FontFamilyAction("Serif", Font.SERIF)); bar.add(new StyledEditorKit.FontFamilyAction("SansSerif", Font.SANS_SERIF)); 

附录:当您使用JComboBox ,您可以将事件转发到相应的StyledEditorKit Action ,默认情况下对当前选择进行操作。

 JComboBox combo = new JComboBox(); combo.addItem("Serif"); combo.addItem("Sans"); combo.addActionListener(new ActionListener() { Action serif = new StyledEditorKit.FontFamilyAction("Serif", Font.SERIF); Action sans = new StyledEditorKit.FontFamilyAction("Sans", Font.SANS_SERIF); @Override public void actionPerformed(ActionEvent e) { if ("Sans".equals(e.getActionCommand())) { sans.actionPerformed(e); } else { serif.actionPerformed(e); } } }); 

这可能有点晚了,但我发现自己陷入了类似的问题,虽然前面的答案确实有帮助,但是当你想要使用计算机上可用的所有字体时,这里有一个更完整的答案。

其中“fonts”是一个字符串数组,其中包含要在程序中使用的所有所需字体

  final JComboBox jcb = new JComboBox(fonts); final Action [] actions = new Action[fonts.length]; for (int i = 0; i < actions.length; i++) { actions[i] = new StyledEditorKit.FontFamilyAction(fonts[i], fonts[i]); } jcb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { for (int i = 0; i < actions.length; i++) { if (fonts[i].equals((String)jcb.getSelectedItem())) { actions[i].actionPerformed(event); break; } } } });