4

メインフレームとその中にロードされた他のフォームを備えたSwingアプリがあります。任意のフォームのすべてのボタンにハンド カーソルを設定する一般的な方法を実装する必要があります。

これは、Web ページで CSS を使用して行うことと似ています ( input[type=button] { cursor:pointer; })

4

2 に答える 2

6

@Madprogrammer が提案したようにツリーをたどることは、カーソルを動的に、および/または特定のフォームで変更する場合の方法です。

楽しみのために(そして再びSwingXを披露するためです:) - そのカーソルをグローバルにインストールしたいが気にしない場合は、それを処理するui-delegateをインストールしてください。SwingX では、カスタム ボタン アドオンを実装してプラグインするのと同じくらい簡単です。副作用は他の回答と同じです(ただし、そのように解決することはできません)。通常の欠点 (カスタム UI デリゲートをインストールする場合は常に) は、すべての LAF のデリゲートをサブクラス化してプラグインする必要があることです。

public class ButtonCursorAddon extends AbstractComponentAddon {

    /**
     * @param name
     */
    protected ButtonCursorAddon() {
        super("RolloverCursor");
    }

    @Override
    protected void addBasicDefaults(LookAndFeelAddons addon,
            DefaultsList defaults) {
        UIManager.getDefaults().remove("ButtonUI");
        defaults.add("ButtonUI", "org.jdesktop.swingx.plaf.ButtonCursorAddon$BasicButtonCursorUI");
    }

    @Override
    protected void addMetalDefaults(LookAndFeelAddons addon,
            DefaultsList defaults) {
        UIManager.getDefaults().remove("ButtonUI");
        defaults.add("ButtonUI", "org.jdesktop.swingx.plaf.ButtonCursorAddon$MetalButtonCursorUI");
    }

    @Override
    protected void addWindowsDefaults(LookAndFeelAddons addon,
            DefaultsList defaults) {
        UIManager.getDefaults().remove("ButtonUI");
        defaults.add("ButtonUI", "org.jdesktop.swingx.plaf.ButtonCursorAddon$WindowsButtonCursorUI");
    }


    @Override
    protected void addNimbusDefaults(LookAndFeelAddons addon,
            DefaultsList defaults) {
        UIManager.getDefaults().remove("ButtonUI");
        defaults.add("ButtonUI", "org.jdesktop.swingx.plaf.ButtonCursorAddon$SynthButtonCursorUI");
    }


    public static class BasicButtonCursorUI extends BasicButtonUI {

        public static ComponentUI createUI(JComponent c) {
            return new BasicButtonCursorUI();
        }

        @Override
        protected BasicButtonListener createButtonListener(AbstractButton b) {
            return new BasicHyperlinkListener(b);
        }

    }

    public static class SynthButtonCursorUI extends SynthButtonUI {

        public static ComponentUI createUI(JComponent c) {
            return new SynthButtonCursorUI();
        }

        @Override
        protected BasicButtonListener createButtonListener(AbstractButton b) {
            return new BasicHyperlinkListener(b);
        }

    }

    public static class MetalButtonCursorUI extends MetalButtonUI {

        public static ComponentUI createUI(JComponent c) {
            return new MetalButtonCursorUI();
        }

        @Override
        protected BasicButtonListener createButtonListener(AbstractButton b) {
            return new BasicHyperlinkListener(b);
        }

    }

    public static class WindowsButtonCursorUI extends WindowsButtonUI {

        public static ComponentUI createUI(JComponent c) {
            return new WindowsButtonCursorUI();
        }

        @Override
        protected BasicButtonListener createButtonListener(AbstractButton b) {
            return new BasicHyperlinkListener(b);
        }

    }

}

// usage: plug-in once in your application code (before creating any buttons)
static {
    LookAndFeelAddons.contribute(new ButtonCursorAddon());
}

次のエラーが表示されます: UIDefaults.getUI() が失敗しました: ComponentUI クラスがありません

私にとってはうまくいきます-UIクラスをUIManagerに登録するとき、デリゲートをインスタンス化するには完全修飾クラス名が必要です:

// here the ButtonCursorUI is in package
// org.jdesktop.swingx.plaf
defaults.add("ButtonUI", "org.jdesktop.swingx.plaf.ButtonCursorAddon$WindowsButtonCursorUI");
// in another package that would be
defaults.add("ButtonUI", myPackageName + ".ButtonCursorAddon$WindowsButtonCursorUI");

通常、(アドオン自体ではなく)something.plafのLAF固有のサブパッケージにさまざまなデリゲートがありますが、それは例です:-)

于 2012-08-18T09:45:03.673 に答える
5

基本的に、コンテナとサブコンテナを歩く必要があります...

ただし、ボタンとは何かに驚かれることでしょう。

public static void setButtonCursor(JComponent component, Cursor cursor) {

    for (Component comp : component.getComponents()) {

        if (comp instanceof JButton) {

            comp.setCursor(cursor);

        } else if (comp instanceof JComponent) {

            setButtonCursor((JComponent)comp, cursor);

        }

    }

}

これには、(他のコンポーネントの中でも) s に入り、ドロップボタンのカーソルを変更するという素晴らしい副作用がJComboBoxあるので、注意してください;)

于 2012-08-18T05:41:27.240 に答える