keycode for ctrl - java

For multiple selection in a Jtree,I am using multiple selection mode in it.It works.But I want to know when i am making multiple selection exactly in this tree to do this i wrote a very simple keycontroller class that implements KeyListener, but i wanna check whether CTRL is pressed or not to do so i am using this code but it seems to be not working :
kc.getKeyCode() == KeyEvent.CTRL_DOWN_MASK ;
what is the keyCode for ctrl ? Or am i doing something wrong ?

As CTRL is a key mask, there is no character for the CTRL key alone.
However, according to KeyEvent documentation, there is always a vaild key code that is sent when either a key is pressed or released. in that case, it should be KeyEvent.CHAR_UNDEFINED and getModifiersEx() should return true for the CTRL key. Notice that, for it to work, you have to register a KeyListener (specially handle for both keyPressed() and keyReleased()).

The key code for Ctrl is KeyCode.VK_CONTROL. In order to find if Ctrl is held you can do this:
if ((event.getModifiers() & ActionEvent.CTRL_MASK) ==ActionEvent.CTRL_MASK) {
System.out.println("CTRL KEY PRESSED");
}
Which is using the java.awt.event.ActionEventinstead of the java.awt.event.KeyEvent. So the code for Ctrl in ActionEvent is CTRL_MASK.
Hope this helps.

Related

Java delete key compare

Hi I ve got one problem:
I write a little calculator in Java Swing. I ve got buttons bind with KeyBindings
and then in actionPerformed I check which key was pressed, it's something like that:
if(event.getActionCommand().equals("\b")) {
}
My question is: is there any way to compare delete button, like backspace button is compared above?
You can use KeyEvent constants to check whether delete key was pressed, e.g.:
if (event.getExtendedKeyCode() == KeyEvent.VK_DELETE) {
//do something
}
Here's javadoc for KeyEvent class.

How do I run a function on a specific key press in JavaFX?

I have a program in javafx that is running and I want to call a function inside that program when a specific key is pressed on the keyboard (for example, the "a" key). I tried using an event handler on my scene but KEY_PRESSED seems to go off when any key is pressed, unless I am using it wrong. KEY_TYPED seems like it might suit my needs, but I've only found examples of that one in relation to text boxes, which is not what I'm looking for. Does anyone know how to do this, or have a good resource I can consult for something like this
Just check the code of the key that was pressed:
scene.setOnKeyPressed(e -> {
if (e.getCode() == KeyCode.A) {
System.out.println("The 'A' key was pressed");
}
});
Use an event filter and whatever keyevent you need, here I use ANY:
scene.addEventFilter(KeyEvent.ANY, keyEvent -> {
System.out.println(keyEvent);
});

Make key codes same

I need to make it so using Robot.keyPress(keycode) will press the correct key that was pressed on a different computer/keyboard.
Right now, pressing '/' will give me a key code that would press (using robot) ';' on a different computer. I'm using getKeyCode() from KeyEvent to get the keycode.
Literally the only code I'm using is Robot.keyPress() and KeyEvent.getKeyCode().
So how can I make the robot press the right key?

Java Swing: Key pressed key stroke on an `InputMap` triggers its action several times while holding down the key

I register
getInputMap().put(KeyStroke.getKeyStroke("pressed RIGHT"), "go right");
When testing the code I get: While I hold the right arrow key down, the action is triggered repeatedly and not only once as I would have expected this.
Interestingly
getInputMap().put(KeyStroke.getKeyStroke("released RIGHT"), "stop");
triggers stop only when the key is finally released.
Is there a way to register a key stroke on an input map, so that the associated action is only triggered once at the moment when the key is pressed?
Documentation of KeyStroke:
A KeyStroke represents a key action on the keyboard, or equivalent
input device. KeyStrokes can correspond to only a press or release of
a particular key, just as KEY_PRESSED and KEY_RELEASED KeyEvents do;
alternately, they can correspond to typing a specific Java character,
just as KEY_TYPED KeyEvents do. In all cases, KeyStrokes can specify
modifiers (alt, shift, control, meta, altGraph, or a combination
thereof) which must be present during the action for an exact match.
To trigger the event only once, at release time, I suggest to register
getInputMap().put(KeyStroke.getKeyStroke("typed RIGHT"), "go right");
The documentation of KeyStroke.getKeyStroke(String) is:
Parses a string and returns a KeyStroke. The string must have the
following syntax:
modifiers* (typedID | pressedReleasedID)
modifiers := shift | control | ctrl | meta | alt | altGraph
typedID := typed <typedKey>
typedKey := string of length 1 giving Unicode character.
pressedReleasedID := (pressed | released) key
key := KeyEvent key code name, i.e. the name following "VK_".
To trigger the event only once, at press time, I suggest to register the press and release events to manage yourself a latch with a boolean.
Is there a way to register a key stroke on an input map, so that the associated action is only triggered once at the moment when the key is pressed?
Remove the keyPressed binding from the InputMap. Then for the keyReleased Action you add the keyPressed binding back to the InputMap.
However, even this can cause problems because on a Windows OS the sequence of KeyEvents is:
pressed, pressed, pressed.... released.
This makes sense to me as generally when you hold the key down you want the character to repeat. However, on a Mac I believe the sequence is:
pressed, released, pressed, released, pressed, released
which doesn't make sense to me and makes it difficult to determine when a key has truly been released.
The "key typed" event operates per platform behaviour -- which, as standard since before the 1980's, has always included auto-repeat. This would be driven by the low-level events from the OS.
You could try not holding down the keys? You shouldn't be mashing the keyboard, it's a precision instrument.
You can possibly change the key-stroke binding (to avoid receiving auto-repeat) or otherwise use a custom event-listener & handle only the low-level keydown/ keyup event once. Low-level events may however expose keycodes (as they are below the level of actually typing any one character) rather than characters.

Weird behavior of keyboard events in Java

When I press "Delete" button on the keyboard, program gets three events - KEY_PRESSED, KEY_TYPED, and KEY_RELEASED. The problem is, in KEY_PRESSED and KEY_RELEASED, parameter "keyCode" is set, but in the KEY_TYPED it is not (in fact, there no meaningful info in that event). With F5 key, it is even funnier - KEY_PRESSED and KEY_RELEASED are registered, but KEY_TYPED never occurs.
The listener was added via Toolkit.getDefaultToolkit().addAWTEventListener(). Using JDK 6.26.
What could be my problem?
EDIT:
Here are the events that happen when Delete key is pressed:
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=127,keyText=Delete,keyChar=Delete,keyLocation=KEY_LOCATION_STANDARD,rawCode=119,primaryLevelUnicode=127,scancode=0] on javax.swing.JButton[,0,0,61x30,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth.SynthBorder#50f38cf0,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=javax.swing.ImageIcon#6ae2d0b2,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=SVG,defaultCapable=false]
java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar=Delete,keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=127,scancode=0] on javax.swing.JButton[,0,0,61x30,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth.SynthBorder#50f38cf0,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=javax.swing.ImageIcon#6ae2d0b2,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=SVG,defaultCapable=false]
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=127,keyText=Delete,keyChar=Delete,keyLocation=KEY_LOCATION_STANDARD,rawCode=119,primaryLevelUnicode=127,scancode=0] on javax.swing.JButton[,0,0,61x30,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth.SynthBorder#50f38cf0,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=javax.swing.ImageIcon#6ae2d0b2,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=SVG,defaultCapable=false]
better would be implements KeyBindings
part of keyboard are reserved Keys for built-in JComponent funcionality, more informations from #camickrs UIManager Defaults
depends of reason(s) why you needed implents KeyListener, because for there are lots of another Listeners for various JComponent, that should be filtering or register text changes inside
some of JComponent Models generated Events from Mouse and Keyboard input
From the JavaDoc The "key typed" event. This event is generated when a character is entered. In the simplest case, it is produced by a single key press. Often, however, characters are produced by series of key presses, and the mapping from key pressed events to key typed events may be many-to-one or many-to-many.
You are trying to get the F5 key which is probably not registered as a character being entered. By using the KEY_RELEASED you will consistently get the result you are looking for and the API is behaving as expected.
Key typed events ALWAYS generate '0' as the key code. Look up the method getKeyChar() instead, or (as has been suggested) listen for keyReleased() instead.
getKeyChar(): http://goo.gl/ajH03

Categories

Resources