The default button input card as a synthesizer?

I am trying to use UIManager to get and clear the default keyword bindings so that the spacebar doesn't activate my JButtons, as described here . The problem is probably because of my appearance synth, (InputMap)UIManager.get("Button.focusInputMap"); returns a null . Does anyone know how easy it is to clear component input cards in some other way or why does UIManager return null in this case? Any advice is appreciated, thanks in advance.

+4
source share
2 answers

I am not near the computer to try this, but looking at the openjdk 7 source here , the display looks by default by default.

Perhaps, but a slightly hacked solution might be to create and install a SynthStyleFactory decorator that changes the style until it returns.

EDIT: I updated the below code example as I had the opportunity to test this. It did not work in its original form, but the updated code worked for me.

 import 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; } } 

EDIT: I can't seem to add a comment to the original post, so just to clarify, I confirmed that UIManager.get ("Button.focusInputMap") returned null with a simple Synth before creating any components. Perhaps Nimbus redefines this behavior.

  SynthLookAndFeel laf = new SynthLookAndFeel(); UIManager.setLookAndFeel(laf); System.out.println(UIManager.get("Button.focusInputMap") == null); 
+3
source

First: I like the idea of ​​decorated StyleFactory, as suggested in another answer, @David :-) - so if that works, suggest using this direction.

In any case, we could not help experimenting a bit: it seems that Nimbus (and possibly other Synth-based databases) override these default settings extremely early in the life cycle: they only accept them if they made before

 // 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"); 

If the UIManager does not return inputMap at this point, I would consider this to be the wrong behavior of your custom LAF and try to figure out why this is happening. Another thing you could try is to set up a completely new inputMap (which would have the advantage of surviving the LAF switch, as it is not a UIR source, for example:

 // 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); 
+4
source

Source: https://habr.com/ru/post/1434666/


All Articles