更改Swing应用程序上所有按钮的光标

Mil*_*lox 4 java swing jcomponent cursor jbutton

我有一个Swing应用程序,主框架和其他一些形式加载.我需要实现一个通用方法来为任何表单上的所有按钮设置手形光标.

这类似于我们在网页上用css做的事情(input[type=button] { cursor:pointer; })

kle*_*tra 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());
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:UIDefaults.getUI()失败:没有ComponentUI类

适用于我 - 当使用UIManager注册ui类时,它需要完全限定的类名来实例化委托:

// 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");
Run Code Online (Sandbox Code Playgroud)

通常情况下,你会在something.plaf的LAF特定子包中使用不同的委托(而不是在插件本身)但是,这是一个例子:-)


Mad*_*mer 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);

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

这有一个很好的副作用,走进JComboBoxs(和其他组件)和更改光标的下拉按钮,所以要小心;)