我正在尝试使用UIManager获取并清除一些默认的按键绑定,以便空格键不会激活我的JButtons,就像这里所解释的那样。问题是,由于我的外观和感觉,(InputMap)UIManager.get("Button.focusInputMap");
返回了一个null
。有没有人知道一种更容易清除组件输入映射的方法,或者为什么在这种情况下UIManager返回null?任何提示都将不胜感激,提前致谢。
我正在尝试使用UIManager获取并清除一些默认的按键绑定,以便空格键不会激活我的JButtons,就像这里所解释的那样。问题是,由于我的外观和感觉,(InputMap)UIManager.get("Button.focusInputMap");
返回了一个null
。有没有人知道一种更容易清除组件输入映射的方法,或者为什么在这种情况下UIManager返回null?任何提示都将不胜感激,提前致谢。
首先,我喜欢另一位回答者@David提出的装饰StyleFactory的想法 :-) - 如果这种方法可行,建议朝着这个方向发展。
无论如何,我忍不住做了一些尝试:看起来Nimbus(以及可能其他基于Synth的LAF)需要在生命周期的早期进行默认值覆盖:只有在任何组件实际创建之前完成才能接受它们。
// setting LAF
InteractiveTestCase.setLAF("Nimbus");
// tweak inputMap, immediately after setting the ui is fine
// uncomment the following line and it doesn't work
// new JPanel();
InputMap inputMap = (InputMap) UIManager.get("Button.focusInputMap");
inputMap.put(KeyStroke.getKeyStroke("SPACE"), "do-nothing");
// setting LAF
InteractiveTestCase.setLAF("Nimbus");
// tweak inputMap, immediately after setting the ui is fine
InputMap inputMap = (InputMap) UIManager.get("Button.focusInputMap");
InputMap custom = new InputMap();
if (inputMap != null) {
// copy all bindings to custom
...
} else {
// add the binding we know of (as implementation detail)
custom.put(KeyStroke.getKeyStroke("released SPACE"), "released");
}
// overwrite the binding you want to change
custom.put(KeyStroke.getKeyStroke("SPACE"), "do-nothing");
// set the custom map
UIManager.put("Button.focusInputMap", custom);
UIManager.getLookAndFeelDefaults().put("Xxx", "Xxx")
,2. 对于 JButton
不确定,因为我尝试过 JMenu(Item)
,只有在卸载了 Nimbus L&F
的情况下才能正常工作...,3. 在这种情况下,我使用了 putClientProperty("Xxx", "Xxx")
和 ButtonModel
。 - mKorbelimport java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.synth.Region;
import javax.swing.plaf.synth.SynthLookAndFeel;
import javax.swing.plaf.synth.SynthStyle;
import javax.swing.plaf.synth.SynthStyleFactory;
import sun.swing.plaf.synth.DefaultSynthStyle;
public class LnFTest {
public static void main(String[] args) throws UnsupportedLookAndFeelException{
SynthLookAndFeel laf = new SynthLookAndFeel();
laf.load(LnFTest.class.getResourceAsStream("laf.xml"), LnFTest.class);
UIManager.setLookAndFeel(laf);
SynthLookAndFeel.setStyleFactory(new MyStyleFactory(SynthLookAndFeel.getStyleFactory()));
JButton button = new JButton("Test");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("Action Performed");
}
});
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(button, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
}
class MyStyleFactory extends SynthStyleFactory {
private SynthStyleFactory delegate;
private Map overrides;
public MyStyleFactory(SynthStyleFactory delegate){
this.delegate = delegate;
overrides = new HashMap();
overrides.put("Button.focusInputMap", new UIDefaults.LazyInputMap(new Object[0]));
}
public SynthStyle getStyle(JComponent c, Region id) {
SynthStyle style = delegate.getStyle(c, id);
System.out.println("Style is a: " + style);
if(style instanceof DefaultSynthStyle){
((DefaultSynthStyle)style).setData(overrides);
}
return style;
}
}
编辑: 似乎我无法在原始帖子中添加评论,因此仅澄清一下,在创建任何组件之前,我已确认UIManager.get("Button.focusInputMap")只使用纯净的Synth返回null。可能是Nimbus覆盖了这种行为。
SynthLookAndFeel laf = new SynthLookAndFeel();
UIManager.setLookAndFeel(laf);
System.out.println(UIManager.get("Button.focusInputMap") == null);
public Object get(SynthContext context, Object key)
,它只调用了那个私有静态方法。它只使用了key。 - David Hutchison(InputMap)style.get(null, "Button.focusInputMap")
会导致空指针异常,即使上下文没有被使用... - SuperTron