1

現在のルック アンド フィールを使用しながら、ボタンの押下を検出できる JSpinner コントロールを作成する必要があります。次のように、これを簡単に実行できることがわかりました。

class CustomSpinnerUI extends BasicSpinnerUI {
    @Override
    protected Component createNextButton() {
        // Add custom ActionListener.
    }

    @Override
    protected Component createPreviousButton() {
        // Add custom ActionListener.
    }
}

問題は、これを行うことで、残りの UI と同じルック アンド フィールを使用しない見苦しいスピナーになってしまうことです。現在使用してNimbusいますが、異なる L&F 構成をサポートする必要があります。

ある種の動的プロキシをセットアップすることを考えましたが、それSpinnerを可能にする適切なインターフェースが見つかりませんでした。

誰でも問題を回避する方法を考えることができますか? ActionListenersをサブクラス化せずにボタンを取得するか、正しい L&F を使用するBasicSpinnerUI方法を考え出す必要があると考えています。CustomSpinnerUI

編集: 「デフォルトのルック アンド フィール」 -> 「現在のルック アンド フィール」。

4

1 に答える 1

5

「カスタムactionListenerをフックインするためのボタンにアクセスする方法」の問題に対する汚い技術的な答えは、スピナーの子をループして、名前で識別されるボタンにリスナーを追加することです。

    JSpinner spinner = new JSpinner();
    Action action = new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {
            LOG.info("button " + ((Component) e.getSource()).getName());
        }
    };
    for (Component child : spinner.getComponents()) {
        if ("Spinner.nextButton".equals(child.getName())) {
            ((JButton) child).addActionListener(action);
        }
        if ("Spinner.previousButton".equals(child.getName())) {
            ((JButton) child).addActionListener(action);
        }
    }
  • LAFが尊重するかもしれないし、尊重しないかもしれない文書化されていない実装の詳細に依存しているので、それは汚いです:メタル、ニンバスはそうします。勝てない(私は見落としだと思うが、それは別の話だ:-)
  • 質問に対する最近のコメントから判断すると、本当の問題はどこかにあるように思われるので、それは技術的なものにすぎません。
于 2011-10-06T12:21:54.500 に答える