I'm just trying to get the basics down when it comes to simple drawing programs. I have a program that draws a rectangle and then lets me move it in any direction. I use a thread for smooth actions. However, what kind of bothers me is that if I press down three keys and release two of them, the program won't detect the third, thus leaving the rectangle stationary.
Am I asking for too much here, or might it be hardware related? I have a pretty cheap keyboard.
Here's the full program if you want to go for a ride.
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Boxxy extends JFrame implements Runnable{
int xPos, yPos, xDir, yDir;
MyPanel panel;
ImageIcon ii;
Image i;
public Boxxy() {
setSize(400,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
panel = new MyPanel();
add(panel);
setVisible(true);
}
class MyPanel extends JPanel {
private static final long serialVersionUID = 1L;
private int squareX = 0;
private int squareY = 0;
private int squareW = 20;
private int squareH = 20;
private MyPanel() {
setFocusable(true);
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case (KeyEvent.VK_UP): setyDir(-1);
break;
case (KeyEvent.VK_DOWN): setyDir(1);
break;
case (KeyEvent.VK_LEFT): setxDir(-1);
break;
case (KeyEvent.VK_RIGHT): setxDir(1);
break;
}
}
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case (KeyEvent.VK_UP): setyDir(0);
break;
case (KeyEvent.VK_DOWN): setyDir(0);
break;
case (KeyEvent.VK_LEFT): setxDir(0);
break;
case (KeyEvent.VK_RIGHT): setxDir(0);
break;
}
}
});
}
private void repaintSquare(int x, int y) {
int OFFSET = 1;
if ((squareX!=x) || (squareY!=y)) {
repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
squareX=x;
squareY=y;
repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
}
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(squareX,squareY,squareW,squareH);
}
}
private void move() {
panel.repaintSquare(xPos, yPos);
xPos += xDir;
yPos += yDir;
}
private void setxDir(int x) {
this.xDir = x;
}
private void setyDir(int y) {
this.yDir = y;
}
public static void main(String[] args) {
Thread t = new Thread(new Boxxy());
t.start();
}
@Override
public void run() {
try {
while(true) {
move();
Thread.sleep(5);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}