メインフレームとその中にロードされた他のフォームを備えたSwingアプリがあります。任意のフォームのすべてのボタンにハンド カーソルを設定する一般的な方法を実装する必要があります。
これは、Web ページで CSS を使用して行うことと似ています ( input[type=button] { cursor:pointer; }
)
メインフレームとその中にロードされた他のフォームを備えたSwingアプリがあります。任意のフォームのすべてのボタンにハンド カーソルを設定する一般的な方法を実装する必要があります。
これは、Web ページで CSS を使用して行うことと似ています ( input[type=button] { cursor:pointer; }
)
@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固有のサブパッケージにさまざまなデリゲートがありますが、それは例です:-)
基本的に、コンテナとサブコンテナを歩く必要があります...
ただし、ボタンとは何かに驚かれることでしょう。
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
あるので、注意してください;)