Java KeyBindings not working after entering text in jTextField? - java

Basically, I have a java program that acts like a media player, PLAY PAUSE FAST FORWARD options etc.
Which also have keybindings.
However, in another JPanel I also have a JTextField that allows the user to enter some text to act as commentary.
If the user decides to write some text, then this JTextField is focused and they key bindings don't work anymore.
But if I did setFocusable(false) to all containers and child containers, the user won't be able to enter text into the JTextfield.
How do I solve this?

JComponent#getInputMap uses WHEN_FOCUSED by default.
Depending on your needs you can use WHEN_ANCESTOR_OF_FOCUSED_COMPONENT or WHEN_IN_FOCUSED_WINDOW to change the level of focus you component needs in order to respond to key input
See JComponent#getInputMap(int) and How to Use Key Bindings for more details

Related

Java AWT Robot - how to read item text / label?

I need to select appropriate option from the popup window. Unfortunately, it is not the popup displayed by the web page, so I cannot use Selenium framework for that purpose.
As I checked, it is possible to navigate to different option by pressing arrow keys. Thus keyPress and keyRelease​ from Java AWT Robot should work for me perfectly to select option and confirm the selection by pressing Enter key.
Unfortunately, I do not see a method to read currently selected item text. Without that I cannot find appropriate option. Is it possible to read item label using Java AWT Robot?
If the target application is another java application, then you should be able to get a reference to the component hierarchy and traverse it until you find the text field & label in question.
Assuming it's not a java application, then I don't believe it's possible to do this - at least directly. Robot just provides mouse / keyboard input, but you could use it combined with other classes in the toolkit to at least partially solve your problem.
Use the Robot methods keyPress & keyRelease to input CTRL-A. Then CTRL-C.
Once the text is in the clipboard, you could read it using Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor)
You might be able to use the same approach for a text label, assuming it is selectable.
This question is talking about using java.awt.Robot to alter text in another program (MS excel), but it might provide you some additional ideas for tackling the problem:
How can I select text in another application with java.awt.robot (example: shift+home)

Finish input into JEditorPane on ENTER

I am using a JEditorPane as a component to show code. The JEditorPane resides in my custom PropertyEditorSupport for my Netbeans Platform app and is show in an OutlineView and the Properties window.
I've already limited the JEditorPane to be one line only, using a DocumentFilter. However I am not able to rebuild the funcionality a JTextField has, to finish input into the component by hitting the ENTER key.
I have already thought about adding a KeyListener event to my JEditorPane but am not sure what to do in case of the event. Is there a method to be called to "finish input of text"?
I am using a JEditorPane as a component to show code.
I've already limited the JEditorPane to be one line only
Those two statements seems to contradict one another. Usually codes consists of multiple lines, not one line.
In any case if you are simply display text then I would use a JTextPane as it supports text attributes. A JEditorPane is used to display HTML.
I have already thought about adding a KeyListener event
Don't use a KeyListener. Swing was designed to be used with Key Bindings. Basically you create an Action (in your case you would extend TextAction) and you bind the Action to a KeyStroke. Check out Key Bindings which contains more information as well as a link to the Swing tutorial on How to Use Key Bindings.

How to bind properties of two UI objects in Java?

I have a simple Java application with textfields and buttons. I am looking for the best and quick way to bind the state of one JTextField to the state of one JButton. I'm using Eclipse, so I don't need any tricks of Netbeans IDE.
Suppose a user needs to input a value into a textfield in order to be able to send a request. The button should be enabled only if the value of the textfield is not empty and consists at least of 3 symbols. If the user deletes the input, the button becomes disabled.
I come from the Flex-world. Such a task can be solved there very easy. One should just write something like this:
<mx:Button enabled = "{myTextField.text.length >= 3}" />
Is there such an opportunity in Java? How is it called? I hope, I don't need to write event listeners for each pair of logicaly connected UI elements, do I?
I would do it with a DocumentListener on the JTextField. Every time the Document changes, you check the state of your button, like button.setEnabled(textField.getText().length > 3)

How to use TextChanged event?

I have a text box in which the user enters a unique number. After he enters a number and press tab or enter. I want to write query to search record matching to that unique number. The number is an integer. It will be passport no, pan card no or etc. If it is available in database, I want to display all information of that user.
I don't want to do that on button click.
I was looking for some TextChanged event but I found that the alternative in Java is the methods in document listener. But I am not getting how to use that. Also in Netbeans in the design view it does not show me any event on text changed. How to use Documentlistener to my JFrame/how to fix this?
Here you can find a tutorial on DocumentListeners and example code as well.

How do I fire an action when the user leaves a JTextBox?

I've got a JTextField, and I'd like the system to do some processing on what the user typed whenever the user leaves the text field. The ActionListener that you can add to just the JTextField only fires when the user presses enter, however.
I'd like the processing routine to run whenever the user leaves the text box by any means - tabs, clicks out of it, presses enter, etc. (The processing in question is to save the text the user typed to the appropriate data object, nothing fancy.)
My google-fu has failed on this one: I'm confident that it's possible, I just can't see how.
Add a FocusListener.
It's worth noting that this is a relatively low-level listener. On JComboBox it wont work unless you find the text field (and perhaps button) that the particular PL&F inserts. Swing is a bit odd that way (amongst many other ways).
Although for my money, non-cosmetic changes that happen when focus leaves a field give poor user experience. Much better to do any relevant changes on every change with a listener on the text field's document.
If you want to edit the text as it is typed then you should use an DocumentFilter.
If you want to validate the text as a complete entity then you can use an InputVerifier.

Categories

Resources