Я пытаюсь сделать программу, которая перемещает прямоугольник по экрану при нажатии клавиш со стрелками. На данный момент я работаю над привязками клавиш после того, как KeyListeners оказались ненадежными и довольно бесполезными. Прежде чем пытаться заставить прямоугольник двигаться, я просто пытаюсь заставить нажатие клавиши со стрелкой вверх вызвать System.out.println("Up key pressed!")
, просто чтобы убедиться, что мои KeyBindings действительно работают. Проблема в том, что это не так. Я следую этому учебник, который немного отличается от того, что я пытаюсь достичь, но все же должен научить меня, как использовать привязки клавиш. Почему KeyBinding не работает?
Код:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class GamePanel extends JPanel implements Runnable{
boolean isRunning = true;
int count = 0;
Thread t;
static int rectX = 250;
static int rectY = 250;
Action upAction;
Action downAction;
Action leftAction;
Action rightAction;
public GamePanel()
{
upAction = new UpAction();
t = new Thread(this);
t.run();
/*downAction = new DownAction();
leftAction = new LeftAction();
rightAction = new RightAction();*/
this.getInputMap().put(KeyStroke.getKeyStroke("UP"), "upMotion");
this.getActionMap().put("upMotion",upAction);
}
public void run()
{
loop();
}
public void loop()
{
if(isRunning)
{
Thread t = Thread.currentThread();
try
{
t.sleep(5);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
repaint();
}
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
count += 1;
g.drawString(Integer.toString(count), 10, 10);
g.drawRect(rectX, rectY, 50, 50);
loop();
}
static class UpAction extends AbstractAction
{
public void actionPerformed(ActionEvent e)
{
System.out.println("Up key pressed!");
rectY++;
}
}
}
Основной код JFrame:
import javax.swing.*;
public class MainFrame{
JFrame frame = new JFrame("Space Invaders");
GamePanel gamepanel = new GamePanel();
public MainFrame()
{
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setSize(500,500);
frame.setLocationRelativeTo(null);
frame.add(gamepanel);
}
public static void main(String[] args)
{
new MainFrame();
}
}
this
из конструктора). Попробуйте запустить методloop
в новом потоке. - person kajacx   schedule 28.07.2014new GamePanel();
в своем фрейме (и эта инициализация будет вызываться непосредственно перед конструктором фрейма), но ваш конструктор GamePanel останавливает текущий поток, поэтому вы ничего не увидите. Я прав? - person kajacx   schedule 28.07.2014