0

私はとを持っていJToolBarますJTextPane。ツールバーには、太字や下線などのボタンがあります。ボタンを押すと、テキストのサイズが大きくなるボタンを追加しようとしました。

このコードは、ToolBarクラスの先頭に表示され、デフォルト値が24であるDisplayクラスのintと等しく設定されます。これは、元のフォントサイズを設定するために使用されます。

static int size = Display.size;

このコードは私のToolBar()コンストラクターにあります。

final JButton reduceButton = new JButton(new ImageIcon("res/reduce.png"));
reduceButton.setToolTipText("Reduce Text...");
reduceButton.setFocusable(false);
reduceButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        size -= 4;
        System.out.println("FontSize = " + size);
    }
});
reduceButton.addActionListener(new StyledEditorKit.FontSizeAction("myaction-", size));

何らかの理由でボタンが機能しませんが、コードを次のように変更すると次のようになります。

reduceButton.addActionListener(new StyledEditorKit.FontSizeAction("myaction-", 40));

..それからそれは働きます。なぜこれなのか分かりますか?

4

1 に答える 1

2

問題は、2回目の呼び出しでサイズが固定されることです。そのコードが最初に実行されたときaddActionListenerの値が何であれ、それが残ることになります。size

フォントサイズを動的に変更する必要がある場合は、以前のアクションリスナー内で変更する必要があります。次のようなものを試してください

reduceButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        size -= 4;
        System.out.println("FontSize = " + size);
        // Font has changed, instantiate a new FontSizeAction and execute it immediately.
        new StyledEditorKit.FontSizeAction("myaction-", size).actionPerformed(arg0);
    }
});

これは、アクションを呼び出すためだけに新しいアクションオブジェクトを作成するのは少し奇妙です。おそらく、エディターオブジェクトのフォントを直接変更するためだけにこれを書き直します。

余談ですが、このような静的で可変の変数を使用することは一般的に悪い考えです。

actionEventのactionCommand文字列を介してコンストラクターで指定したフォントサイズをオーバーライドできるようです。http://opensourcejavaphp.net/java/harmony/javax/swing/text/StyledEditorKit.java.htmlを参照してください

public void actionPerformed(final ActionEvent event) {
        Object newValue = null;
        if (event != null) {
            try {
                newValue = new Integer(event.getActionCommand());
            } catch (NumberFormatException e) {
            }
        }
        performAction(event, StyleConstants.FontSize, null, defaultValue,
                      newValue, false);
    }

しかし、私が最初に投稿したものは機能するはずです。問題が何であるかがわからない場合は、もう一度調べます。

于 2012-09-03T06:32:38.583 に答える