[Java] Detect key pressed.

Nenad

~Choco Coronet~ Omnomnom
Reaction score
137
Well, looked around the interwebs and tried a few solutions nothing seems to work so far. I need to detect when a key is pressed, specifically the arrow keys. For now, I've got this method (There are other methods in but they have no relations with this one).

Code:
import java.awt.event.KeyEvent;
import acm.program.*;

public class Sokoban extends ConsoleProgram {
	
	int xpos = 0;
	int ypos = 0;
	char mc = '@';
	char hold = ' ';
	char[][] grid = new char[7][9]; //Creates the grid based of the Level base imaginary two dimensional array in comments.
	
	public void createlevel()
	 {
		String Levelbase = ("##########  $   .##  ##   ##  @   ###  #$$ ###  #. .###########"); 
		// "#########"         																						
		// "#  $   .#" 																						
		// "#  ##   #" 																						
		// "#  @   ##" 																						
		// "#  #$$ ##" 																						
		// "#  #. .##" 																						
		// "#########"
		
		int k = -1; //Counts characters in Level Base.
		for (int i=0; i<grid.length; i++)
		{
			for (int j=0; j<grid[i].length; j++)
			{
			k=k+1;	
			grid[i][j] = Levelbase.charAt(k);
			
			if (j == 8) //Prints out the level.
			{
				println(grid[i][j]);
			}
			
				else
				{
					print(grid[i][j]);
				}
			}
	     }
		xpos = 3; // Set x of main char;
		ypos = 3; // Set y of main char;
	  }
    public void keyPressed(KeyEvent e) {
	    int keyCode = e.getKeyCode();
	    switch( keyCode ) { 
	        case KeyEvent.VK_UP:
	        	
	        	 mc = grid[xpos][ypos];
		         hold = grid[xpos][ypos-1];
		         mc = grid[xpos][ypos-1];
		         hold = grid[xpos][ypos];
	        	
	            break;
	        case KeyEvent.VK_DOWN:
	        	
	        	 mc = grid[xpos][ypos];
		         hold = grid[xpos][ypos+1];
		         mc = grid[xpos][ypos+1];
		         hold = grid[xpos][ypos];
	        	
	            break;
	        case KeyEvent.VK_LEFT:
	        	
	            mc = grid[xpos][ypos];
	            hold = grid[xpos-1][ypos];
	            mc = grid[xpos-1][ypos];
	            hold = grid[xpos][ypos];
	            
	            break;
	        case KeyEvent.VK_RIGHT :

	        	 mc = grid[xpos][ypos];
		         hold = grid[xpos+1][ypos];
		         mc = grid[xpos+1][ypos];
		         hold = grid[xpos][ypos];
		         
	            break;
	     }
	} 
	
	public void run ()
	{
		createlevel();
	}
}

That is my entire code, and once again it would be helpful to explain what we're doing here. The main problem now is to get the actions keys to respond. Also, if anyone has any suggestions about improving the said code up top i don't mind that as well, but i would like to keep the focus on the main problem. Without this i won't really get far ^^

Edit: Oh and yeah, whenever i press a key nothing happens, i added a debugger before that prints a line but it doesn't activate, so my method does not in fact register the keys.
 

GetTriggerUnit-

DogEntrepreneur
Reaction score
129
That's not how it works. You never tell your program to bind any event. And KeyListener is for AWT and Swing, not console.

There's no way to hook the keyboard in Java, unless you use JNI

I had done it for a guy once but I can't find the thread.

EDIT: Oh there I find it..
http://www.thehelper.net/forums/sho...scape-Key-press-in-Java?p=1254842#post1254842
I don't think you could use SetWindowsHookEx because Java does not have a such thing as IntPtr (C#).

You also need to make a different Library for every OS your program's going to run on, since the Library contains OS calls.
 

UndeadDragon

Super Moderator
Reaction score
447
Keyboard events won't work in Console AFAIK.
 

GetTriggerUnit-

DogEntrepreneur
Reaction score
129
Alright, I had some free time so I decided to just do it.

Only works with windows tho.

It basicly catches every single key that is pressed and generates an event with it.

boolean keydown:
true keydown
false keyup
int vk:
virtual key code

Code:
package test;

import javax.swing.JFrame;
import jhook.Keyboard;
import jhook.KeyboardListener;

/*
 * @Author: Simon
 */

public class Main {

    public static void main(String[] args) {
        new JFrame().setVisible(true); // Just so it stays Idle

        Keyboard kb = new Keyboard();
        kb.addListener(new KeyboardListener() {
            public void keyPressed(boolean keydown, int vk) {
                if (keydown && vk == Keyboard.VK_ESCAPE) {
                    System.exit(0); // The escape key will be catched from anywhere!!
                }
            }
        });

    }
}

Download and extract JHook.jar from the zip file attached below and add the jar to your project's build path. Use the code above to make what you want.
 

Nenad

~Choco Coronet~ Omnomnom
Reaction score
137
Thanks a lot for the time, however, still doesn't work. Doesn't register a keyboard event no matter what i do <.< . I guess i'll just have to try using the graphics program (which can detect key press easier ><).
 

Nenad

~Choco Coronet~ Omnomnom
Reaction score
137
Code:
package oving4;

import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import jhook.Keyboard;
import jhook.KeyboardListener;
import acm.program.*;

public class Sokoban extends ConsoleProgram {
	
	int xpos = 0;
	int ypos = 0;
	char mc = '@';
	char hold = ' ';
	char[][] grid = new char[7][9]; //Creates the grid based of the Level base imaginary two dimensional array in comments.
	
	public void createlevel()
	 {
		String Levelbase = ("##########  $   .##  ##   ##  @   ###  #$$ ###  #. .###########"); 
		// "#########"         																						
		// "#  $   .#" 																						
		// "#  ##   #" 																						
		// "#  @   ##" 																						
		// "#  #$$ ##" 																						
		// "#  #. .##" 																						
		// "#########"
		
		int k = -1; //Counts characters in Level Base.
		for (int i=0; i<grid.length; i++)
		{
			for (int j=0; j<grid[i].length; j++)
			{
			k=k+1;	
			grid[i][j] = Levelbase.charAt(k);
			
			if (j == 8) //Prints out the level.
			{
				println(grid[i][j]);
			}
			
				else
				{
					print(grid[i][j]);
				}
			}
	     }
		xpos = 3; // Set x of main char;
		ypos = 3; // Set y of main char;
	  }
	/*
	 * @Author: Simon
	 */

	public class Main {

	    public void main(String[] args) {
	        new JFrame().setVisible(true); // Just so it stays Idle

	        Keyboard kb = new Keyboard();
	        kb.addListener(new KeyboardListener() {
	            public void keyPressed(boolean keydown, int vk) {
	                if (keydown && vk == Keyboard.VK_ESCAPE) {
	                   print("aaaaaaaaaaaaaaaaaaaaa");
	                }
	            }
	        });

	    }
	}
	
	public void run ()
	{
		createlevel();
	}
}

Couldn't start it in the run method (error after error). Couldn't start it normally unless i took out static.
 

GetTriggerUnit-

DogEntrepreneur
Reaction score
129
Ah, you did it wrong, you imported the class and everything.

This should work, althought I haven't tested it.
Code:
package oving4;

import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import jhook.Keyboard;
import jhook.KeyboardListener;
import acm.program.*;

public class Sokoban extends ConsoleProgram {
	
	int xpos = 0;
	int ypos = 0;
	char mc = '@';
	char hold = ' ';
	char[][] grid = new char[7][9]; //Creates the grid based of the Level base imaginary two dimensional array in comments.
	
	public void createlevel()
	 {
		String Levelbase = ("##########  $   .##  ##   ##  @   ###  #$$ ###  #. .###########"); 
		// "#########"         																						
		// "#  $   .#" 																						
		// "#  ##   #" 																						
		// "#  @   ##" 																						
		// "#  #$$ ##" 																						
		// "#  #. .##" 																						
		// "#########"
		
		int k = -1; //Counts characters in Level Base.
		for (int i=0; i<grid.length; i++)
		{
			for (int j=0; j<grid[i].length; j++)
			{
			k=k+1;	
			grid[i][j] = Levelbase.charAt(k);
			
			if (j == 8) //Prints out the level.
			{
				println(grid[i][j]);
			}
			
				else
				{
					print(grid[i][j]);
				}
			}
	     }
		xpos = 3; // Set x of main char;
		ypos = 3; // Set y of main char;
        
        while (true); // Wait for the key on the other thread
	  }
	
	public void run ()
	{
        Thread t = new Thread() {
            public void run() {
                Keyboard kb = new Keyboard();
                kd.addListener(new KeyboardListener() {
                    public void keyPressed(boolean keydown, int vk) {
                        if (keydown && vk == Keyboard.VK_ESCAPE) {
                            print("aaa...");
                        }
                    }
                });
            }
        };
        t.start();
		createlevel();
	}
}
 

Nenad

~Choco Coronet~ Omnomnom
Reaction score
137
Yey! It works!

Can you just tell me whats with the Thread t = new Thread() and the repeated public void run(). i.e why are they there? ^^

Edit: Nevermind, i got it xD
 

GetTriggerUnit-

DogEntrepreneur
Reaction score
129
Hey, I have checked from what ConsoleProgram extends and it extends Program which extends JApplet. Basicly, you could have used addKeyListener, I didn't acm used it's own console at this time (I thought it was just a wrapper class).

Might be too late now tho.
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • Ghan Ghan:
    Still lurking
    +3
  • The Helper The Helper:
    I am great and it is fantastic to see you my friend!
    +1
  • The Helper The Helper:
    If you are new to the site please check out the Recipe and Food Forum https://www.thehelper.net/forums/recipes-and-food.220/
  • Monovertex Monovertex:
    How come you're so into recipes lately? Never saw this much interest in this topic in the old days of TH.net
  • Monovertex Monovertex:
    Hmm, how do I change my signature?
  • tom_mai78101 tom_mai78101:
    Signatures can be edit in your account profile. As for the old stuffs, I'm thinking it's because Blizzard is now under Microsoft, and because of Microsoft Xbox going the way it is, it's dreadful.
  • The Helper The Helper:
    I am not big on the recipes I am just promoting them - I use the site as a practice place promoting stuff
    +2
  • Monovertex Monovertex:
    @tom_mai78101 I must be blind. If I go on my profile I don't see any area to edit the signature; If I go to account details (settings) I don't see any signature area either.
  • The Helper The Helper:
    You can get there if you click the bell icon (alerts) and choose preferences from the bottom, signature will be in the menu on the left there https://www.thehelper.net/account/preferences
  • The Helper The Helper:
    I think I need to split the Sci/Tech news forum into 2 one for Science and one for Tech but I am hating all the moving of posts I would have to do
  • The Helper The Helper:
    What is up Old Mountain Shadow?
  • The Helper The Helper:
    Happy Thursday!
    +1
  • Varine Varine:
    Crazy how much 3d printing has come in the last few years. Sad that it's not as easily modifiable though
  • Varine Varine:
    I bought an Ender 3 during the pandemic and tinkered with it all the time. Just bought a Sovol, not as easy. I'm trying to make it use a different nozzle because I have a fuck ton of Volcanos, and they use what is basically a modified volcano that is just a smidge longer, and almost every part on this thing needs to be redone to make it work
  • Varine Varine:
    Luckily I have a 3d printer for that, I guess. But it's ridiculous. The regular volcanos are 21mm, these Sovol versions are about 23.5mm
  • Varine Varine:
    So, 2.5mm longer. But the thing that measures the bed is about 1.5mm above the nozzle, so if I swap it with a volcano then I'm 1mm behind it. So cool, new bracket to swap that, but THEN the fan shroud to direct air at the part is ALSO going to be .5mm to low, and so I need to redo that, but by doing that it is a little bit off where it should be blowing and it's throwing it at the heating block instead of the part, and fuck man
  • Varine Varine:
    I didn't realize they designed this entire thing to NOT be modded. I would have just got a fucking Bambu if I knew that, the whole point was I could fuck with this. And no one else makes shit for Sovol so I have to go through them, and they have... interesting pricing models. So I have a new extruder altogether that I'm taking apart and going to just design a whole new one to use my nozzles. Dumb design.
  • Varine Varine:
    Can't just buy a new heatblock, you need to get a whole hotend - so block, heater cartridge, thermistor, heatbreak, and nozzle. And they put this fucking paste in there so I can't take the thermistor or cartridge out with any ease, that's 30 dollars. Or you can get the whole extrudor with the direct driver AND that heatblock for like 50, but you still can't get any of it to come apart
  • Varine Varine:
    Partsbuilt has individual parts I found but they're expensive. I think I can get bits swapped around and make this work with generic shit though
  • Ghan Ghan:
    Heard Houston got hit pretty bad by storms last night. Hope all is well with TH.
  • The Helper The Helper:
    Power back on finally - all is good here no damage
    +2
  • V-SNES V-SNES:
    Happy Friday!
    +1
  • The Helper The Helper:
    New recipe is another summer dessert Berry and Peach Cheesecake - https://www.thehelper.net/threads/recipe-berry-and-peach-cheesecake.194169/

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top