Java detect CTRL+X key combination on a jtree - java

I need an example how to add a keyboard handler that detect when Ctrl+C , Ctrl+X , Ctrl+C pressed on a JTree.
I were do this before with menu shortcut keys but with no success.

You can add KeyListeners to any component (f)
f.addKeyListener(new KeyListener() {
#Override
public void keyTyped(KeyEvent e) {
}
#Override
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_C) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
System.out.println("woot!");
}
}
#Override
public void keyReleased(KeyEvent e) {
}
});

Use KeyListener for example :
jTree1.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
if (evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_C) {
JOptionPane.showMessageDialog(this, "ctrl + c");
} else if (evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_X) {
JOptionPane.showMessageDialog(this, "ctrl + x");
} else if (evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_V) {
JOptionPane.showMessageDialog(this, "ctrl + v");
}
}
});
Hope that helps.

Use Key Bindings.

initComponents();
KeyboardFocusManager ky=KeyboardFocusManager.getCurrentKeyboardFocusManager();
ky.addKeyEventDispatcher(new KeyEventDispatcher() {
#Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID()==KeyEvent.KEY_RELEASED && (e.getKeyCode() == KeyEvent.VK_C) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
System.out.println("Dhanushka Tharindu");
}
return true;
}
});

But menu shortcut accelerators are the way to do this normally: myMenuItem.setAccelerator(KeyStroke.getKeyStroke("control C"));

Related

Howto modify java-code from single to simultaneous key press? [duplicate]

I need an example how to add a keyboard handler that detect when Ctrl+C , Ctrl+X , Ctrl+C pressed on a JTree.
I were do this before with menu shortcut keys but with no success.
You can add KeyListeners to any component (f)
f.addKeyListener(new KeyListener() {
#Override
public void keyTyped(KeyEvent e) {
}
#Override
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_C) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
System.out.println("woot!");
}
}
#Override
public void keyReleased(KeyEvent e) {
}
});
Use KeyListener for example :
jTree1.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
if (evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_C) {
JOptionPane.showMessageDialog(this, "ctrl + c");
} else if (evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_X) {
JOptionPane.showMessageDialog(this, "ctrl + x");
} else if (evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_V) {
JOptionPane.showMessageDialog(this, "ctrl + v");
}
}
});
Hope that helps.
Use Key Bindings.
initComponents();
KeyboardFocusManager ky=KeyboardFocusManager.getCurrentKeyboardFocusManager();
ky.addKeyEventDispatcher(new KeyEventDispatcher() {
#Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID()==KeyEvent.KEY_RELEASED && (e.getKeyCode() == KeyEvent.VK_C) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
System.out.println("Dhanushka Tharindu");
}
return true;
}
});
But menu shortcut accelerators are the way to do this normally: myMenuItem.setAccelerator(KeyStroke.getKeyStroke("control C"));

How to use arrow keys instead of buttonListeners?

public void setUpButtonListeners() {
ActionListener buttonListener = new ActionListener() {
#Override
public void actionPerformed(ActionEvent ae) {
Object o = ae.getSource();
if ((o == slots[3][1]) || (o == slots[3][2])) {
slideDown(slots);
} else if ((o == slots[0][1]) || (o == slots[0][2])) {
slideUp(slots);
} else if ((o == slots[1][3]) || (o == slots[2][3])) {
slideRight(slots);
} else if ((o == slots[1][0]) || (o == slots[2][0])) {
slideLeft(slots);
}
}
};
slots[3][1].addActionListener(buttonListener);
slots[3][2].addActionListener(buttonListener);
slots[0][1].addActionListener(buttonListener);
slots[0][2].addActionListener(buttonListener);
slots[1][3].addActionListener(buttonListener);
slots[2][3].addActionListener(buttonListener);
slots[1][0].addActionListener(buttonListener);
slots[2][0].addActionListener(buttonListener);
}
This the relevant code. I can find a ton of information on how to add keylisteners to specific JComponents but all I want to do is make it so that if(up arrow pressed) then slideUp(slots), instead of having to press JButtons on the screen to call these functions.
Edit:
Fixed, and it was really simple.
Added
frame.setFocusable(true);
frame.addKeyListener(new KeyListener() {
#Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
#Override
public void keyPressed(KeyEvent e) {
keyCode = e.getKeyCode();
switch (keyCode) {
case KeyEvent.VK_UP:
slideUp(slots);
}
}
#Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
});
to constructor.
Maybe you should use a custom KeyEventDispatcher to handle the arrow key events, otherwise you will have issues with the components focus.
KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher( new ArrowsKeyDispatcher() );
...
class ArrowsKeyDispatcher implements KeyEventDispatcher {
public boolean dispatchKeyEvent(KeyEvent e) {
if(e.getID() == KeyEvent.VK_UP) {
//Do something here when pressing UP ARROWKEY
}
// Do the same for all keys you need to handle globally
...
return false;
}
}

KeyPressed/KeyReleased not working?

I'm trying to make a game in java, just a simple platformer, but I'm having difficulty when running the code. I can't seem to get any response from key presses. The only thing I can think hasn't been working properly is the keyPressed and keyReleased functions. Below is the relevant code.
public ReflexPanel() {
initBoard();
setFocusable(true);
addKeyListener(this);
Timer timer = new Timer(1000/120, this);
timer.start();
}
private void initBoard() {
loadMenu();
int w = menu.getWidth(this);
int h = menu.getHeight(this);
setPreferredSize(new Dimension(w, h));
}
private void step() {
if(mainMenu){
if(ePressed) {
System.exit(0);
}
if(hPressed) {
loadScores();
repaint();
}
}
}
public void keyTyped(KeyEvent e) {}
#Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 'e') {
ePressed = true;
}
if (e.getKeyCode() == 'h') {
hPressed = true;
}
}
#Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == 'e') {
ePressed = false;
}
if (e.getKeyCode() == 'h') {
hPressed = false;
}
}
#Override
public void actionPerformed(ActionEvent e) {
step();
}
The ePressed and hPressed variables are just booleans set to false by default, and loadScores calls a png file.
You can't do this:
if(e.getKeyCode() == 'e'){
// code logic
}
KeyEvent::getKeyCode doesn't return the char you press on the keyboard. It "returns the integer keyCode associated with the key in this event". When using KeyEvent::getKeyCode you have to use the KeyEvent key constants values predefined in the class. So for example:
if(e.getKeyCode() == KeyEvent.VK_E){
// code logic
}
Or you can use KeyEvent::getKeyChar which "returns the character associated with the key in this event".
You're using getKeyCode() which returns an int value with constants given in KeyEvent class, such as KeyEvent.VK_E.
You're looking to use getKeyChar() which returns 'e' directly.
if (e.getKeyChar() == 'e') { // Now it has an actual chance of working

Get key combinations

How can I get key combination of keys on keyboard E.G. (Ctrl+somekey, Alt+somekey) with Java?
I use KeyEvent listener, MouseEvent listener for all keys on keyboard. I can catch all key event on keyboard by using that listener. But, I cannot catch key combination such as (Ctrl+Alt+Del)....etc.
public void keyPressed(KeyEvent kevt) {
if(kevt.getKeyChar()=='c') {
if(kevt.isAltDown())
//Code if Alt+c pressed
if(kevt.isControlDown())
//Code if Ctrl+c pressed
if(kevt.isShiftDown())
//Code if Shift+c pressed
if(kevt.isAltDown()&&kevt.isControlDown()&&(!kevt.isShiftDown()))
//Code if Alt+Ctrl+c pressed
if(kevt.isAltDown()&&kevt.isShiftDown()&&(!kevt.isControlDown()))
//Code if Alt+Shift+c pressed
if(!(kevt.isAltDown())&&kevt.isControlDown()&&(kevt.isShiftDown()))
//Code if Shift+Ctrl+c pressed
if(kevt.isAltDown()&&kevt.isControlDown()&&kevt.isShiftDown())
//Code if Alt+Ctrl+Shift+c pressed
}
Use the above code, use any character
If you want to check if Alt+C+E is pressed do the following
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.swing.*;
public class Sample implements KeyListener {
private JTextField lbl=new JLabel("Hello");
private JPanel pnl=new JPanel(new BorderLayout());
private JFrame frm=new JFrame ("Sample");
int []arr;int i=0;
public Sample() {
pnl.add("North", lbl);
frm.setContentPane(pnl);
frm.pack();
frm.setVisible(true);
lbl.addKeyListener(this);
arr= new int[3];
public void keyPressed(KeyEvent key) {
arr[i]=key.getKeyCode();
i++;
if((arr[0]==VK_ALT||arr[1]==VK_ALT||arr[2]==VK_ALT)&& (arr[0]==VK_C||arr[1]==VK_C||arr[2]==VK_C)&&(arr[0]==VK_E||arr[1]==VK_E||arr[2]==VK_E)) {
//Code you want
}
}
public void keyReleased(KeyEvent evt) {
arr[i]=null;
}
public void keyTyped(KeyEvent kvt) {
}
}
}
Many of these answers seem very complicated, just thought I'd add my solution.
I wrote a KeyBinder class:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Hashtable;
public abstract class KeyBinder implements KeyListener
{
private Hashtable<Integer, Boolean> keyMap;
private int[] keyCodes;
public KeyBinder(final int... keyCodes)
{
this.keyMap = new Hashtable<>();
this.keyCodes = keyCodes;
}
#Override
public void keyTyped(final KeyEvent e) { }
#Override
public void keyPressed(final KeyEvent e)
{
getKeyMap().put(e.getKeyCode(), true);
if (getKeysDown())
{
onKeysDown();
}
}
#Override
public void keyReleased(final KeyEvent e)
{
getKeyMap().put(e.getKeyCode(), false);
}
private Hashtable<Integer, Boolean> getKeyMap()
{
return this.keyMap;
}
public boolean getKeysDown()
{
for (final int key : this.keyCodes)
{
if (getKeyMap().containsKey(key))
{
if (!getKeyMap().get(key))
{
return false;
}
} else {
return false;
}
}
return true;
}
public abstract void onKeysDown();
}
And then on my control:
final KeyBinder binder = new KeyBinder(KeyEvent.VK_ALT, KeyEvent.VK_A)
{
#Override
public void onKeysDown()
{
System.out.println("Alt+A");
}
};
startButton.addKeyListener(binder);
Easy :)
#Override
public void keyPressed(KeyEvent evt) {
if (evt.getKeyCode()==KeyEvent.VK_CONTROL) { ctrl = true; }
else if (evt.getKeyCode()==KeyEvent.VK_SHIFT) { shift = true; }
else if (evt.getKeyCode()==KeyEvent.VK_ALT) { alt = true; }
else {
keyHit = KeyEvent.getKeyText( evt.getKeyCode() );
System.out.println("Key Hit is "+keyHit);
}
processLocalKeyEvent(evt);
}
#Override
public void keyReleased(KeyEvent evt) {
if (evt.isControlDown() && keyHit != "") ctrl = true;
if (evt.isAltDown() && keyHit != "") alt = true;
if (evt.isShiftDown() && keyHit != "") shift = true;
if (ctrl) sb.append("Ctrl");
if (shift) sb.append("Shift");
if (alt) sb.append("Alt");
if (!ctrl && !shift && !alt) {
sb.append(keyHit);
} else {
sb.append("_"+keyHit);
}
if (ctrl || shift || alt) {
Thread thread = new Thread();
try {
thread.sleep(300);
rfbProto.capture();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if ((ctrl || shift || alt) && keyHit=="") {
rfbProto.capture();
} else if ((!ctrl || !shift || !alt) && keyHit!="") {
rfbProto.capture();
}
ctrl = false;
shift = false;
alt = false;
keyHit = "";
sb = new StringBuffer();
processLocalKeyEvent(evt);
}
private void jTable1KeyReleased(java.awt.event.KeyEvent evt) {
System.out.println(evt.getKeyCode()); //showing code of released button
if(evt.isControlDown() && evt.getKeyCode()==40) // 40 is code for arrow down
{
//if ctrl is pressed and arrow down is released
System.out.println("Released " + evt.getKeyCode());
}
Simple version

How to check KeyListener input?

In java.awt.event.KeyListener, how do I check if the user enters "+" or "- "?
Here's a code example of how to do this:
TextField field = new TextField();
field.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {
final char aChar = e.getKeyChar();
if (aChar == '+') {
System.out.println("+ was typed");
}
if (aChar == '-') {
System.out.println("- was typed");
}
}
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
});

Categories