Reputation: 3
I'm trying to create a program where an object continuously falls down the screen unless the user is pressing space, in which case it moves up. So far I've gotten the object to initially start falling when I run the program. When I press space, the object moves up (like it should). But, when I release the key the object stops moving. I want it to continue falling when the key is released.
I've looked at using key bindings instead of keylistener but I've had trouble with it. I am a highschool student looking to major in computer science so forgive me for not knowing too many advanced coding terms/methods. However, I am one of the best in my class and a fast learner who is eager to solve this problem. Here is my code:
public class htestnew extends JPanel implements ActionListener, KeyListener {
Timer t = new Timer(5, this);
int x = 20, y = 20, vely = 1;
public htestnew() {
t.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
ImageIcon background = new ImageIcon("OBJECTEXAMPLE1");
background.paintIcon(this, g, 0, 0);
}
public void actionPerformed(ActionEvent e) {
if (y < 0)
{
vely = 0;
y = 0;
}
if (y > 305) //-70
{
vely = 0;
y = 305;
}
y += vely;
repaint();
}
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (code == KeyEvent.VK_SPACE) {
vely = -1;
}
}
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
vely = 0;
//I have tried setting this value to 1 but it does not work
}
If it is easier to use keybindings a personal and easy to follow example would be amazing. Thank you.
Upvotes: 0
Views: 187
Reputation: 347214
So, changing...
public void keyReleased(KeyEvent e) {
vely=0;
//I have tried setting this value to 1 but it does not work
}
to...
public void keyReleased(KeyEvent e) {
vely=1;
//I have tried setting this value to 1 but it does not work
}
Basically made it work (after I added in something that actually paints)
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test extends JPanel implements ActionListener, KeyListener {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Test());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
Timer t = new Timer(5, this);
int x = 20, y = 20, vely = 1;
public Test() {
t.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(x, y, 5, 5);
}
public void actionPerformed(ActionEvent e) {
if (y < 0) {
vely = 0;
y = 0;
}
if (y > 305) //-70
{
vely = 0;
y = 305;
}
y += vely;
repaint();
}
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (code == KeyEvent.VK_SPACE) {
vely = -1;
}
}
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
vely = 1;
//I have tried setting this value to 1 but it does not work
}
}
I would strongly recommend that you take a look at How to Use Key Bindings instead of using KeyListener
, it will solve the core problem with KeyListener
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test extends JPanel implements ActionListener {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Test());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
Timer t = new Timer(5, this);
int x = 20, y = 20, vely = 1;
public Test() {
t.start();
addKeyBinding("space.pressed", KeyEvent.VK_SPACE, true, new ChangeYAction(-1));
addKeyBinding("space.released", KeyEvent.VK_SPACE, false, new ChangeYAction(1));
}
protected void addKeyBinding(String name, int virtualKey, boolean pressed, Action action) {
addKeyBinding(name, KeyStroke.getKeyStroke(virtualKey, 0, !pressed), action);
}
protected void addKeyBinding(String name, KeyStroke keyStroke, Action action) {
InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();
im.put(keyStroke, name);
am.put(name, action);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(x, y, 5, 5);
}
public void actionPerformed(ActionEvent e) {
if (y < 0) {
vely = 0;
y = 0;
}
if (y > 305) //-70
{
vely = 0;
y = 305;
}
y += vely;
repaint();
}
public class ChangeYAction extends AbstractAction {
private int changeYTo;
public ChangeYAction(int changeYTo) {
this.changeYTo = changeYTo;
}
@Override
public void actionPerformed(ActionEvent e) {
vely = changeYTo;
}
}
}
Upvotes: 2