3

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

だから私の問題を要約すると:a)選択された個々のフォントに敏感でb)どういうわけかStyledEditorKit.FontFamilyActionを使用して生活を楽にするようにリスナーをComboBoxに適切に設定する方法がわかりませんか?

スラッシュ、私がこれについて間違った方法で何かに近づいているなら、私は正しい方法を聞きたいです。私が言ったように、インターネット上の私の情報源は、この主題についてあまり明確ではありません。

本当にありがとう!

4

2 に答える 2

3

StyledEditorTestActionsをに入れますJToolBarが、考え方は同じです。ここHTMLDocumentEditorで言及されているCharlesBell'sも参照してください。例えば、

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);
        }
    }
});
于 2012-05-13T01:25:01.640 に答える
0

これは少し遅いかもしれませんが、私は同様の問題に悩まされていることに気付きました。前の答えは役に立ちますが、コンピューターで使用可能なすべてのフォントを使用する場合のより完全な答えがここにあります。

ここで、「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;
                    }
                }
            }
        });
于 2013-05-22T04:13:51.043 に答える