This is my code.I am trying to make the ball move using arrow keys.
As i run the above program ball is not displayed (if i change the coordinates to like 0,30 ball is displayed)
and event is not fired ,ball neither moves nor jumps
What is the problem
?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class ControlledBall extends JPanel{
int diameter = 30;
int height = 30;
int x_Pos = 0;
int y_Pos;
ControlledBall() {
JFrame fr = new JFrame("Controlled Ball");
this.setBackground(Color.black);
fr.add(this);
fr.setVisible(true);
fr.setSize(600,400);
y_Pos = this.getHeight() - diameter ;
register();
repaint();
}
public void register() {
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent ke) {
if( ke.getKeyCode() == ke.VK_RIGHT ) {
increment();
}
else if( ke.getKeyCode() == ke.VK_LEFT ) {
decrement();
}
else if( ke.getKeyCode() == ke.VK_UP) {
jump();
}
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor( Color.blue );
g.fillOval( x_Pos , y_Pos , diameter , height );
System.out.println("testing...");
}
public void increment() {
x_Pos++;
if( x_Pos > (this.getWidth() - diameter) ) {
x_Pos = this.getWidth() - diameter;
}
repaint();
}
public void decrement() {
x_Pos--;
if( x_Pos <= 0) {
x_Pos = 0;
}
repaint();
}
public void jump() {
y_Pos++;
if( y_Pos <=0 ) {
y_Pos = 0;
}
repaint();
}
public static void main( String args[] ) {
new ControlledBall();
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class ControlledBall extends JPanel{
int diameter = 30;
int height = 30;
int x_Pos = 0;
int y_Pos;
ControlledBall() {
JFrame fr = new JFrame("Controlled Ball");
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBackground(Color.red);
setPreferredSize(new Dimension(400,300));
fr.add(this);
fr.setVisible(true);
// important!
fr.pack();
//fr.setSize(600,400);
y_Pos = this.getHeight()/2;
register();
repaint();
}
public void register() {
// very important!
setFocusable(true);
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent ke) {
if( ke.getKeyCode() == ke.VK_RIGHT ) {
increment();
}
else if( ke.getKeyCode() == ke.VK_LEFT ) {
decrement();
}
else if( ke.getKeyCode() == ke.VK_UP) {
jump();
}
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor( Color.orange );
g.fillOval( x_Pos , y_Pos , diameter , height );
}
public void increment() {
x_Pos++;
if( x_Pos > (this.getWidth() - diameter) ) {
x_Pos = this.getWidth() - diameter;
}
repaint();
}
public void decrement() {
x_Pos--;
if( x_Pos <= 0) {
x_Pos = 0;
}
repaint();
}
public void jump() {
y_Pos++;
if( y_Pos <=0 ) {
y_Pos = 0;
}
repaint();
}
public static void main( String args[] ) {
new ControlledBall();
}
}
Please replace the code with the following code and you will get the real picture that the KeyEvent are been consumed by the main JFrame.
To make sure you get all those events, you don't have to register on components, but rahter by using a KeyboardFocusManager, which will receive key events wherevere they occur.
ControlledBall() {
JFrame fr = new JFrame("Controlled Ball");
this.setBackground(Color.black);
this.setBorder( BorderFactory.createLineBorder( Color.white ) );
fr.add(this);
fr.setSize(600,400);
y_Pos = this.getHeight() - diameter ;
register();
fr.setVisible(true);
repaint();
fr.addKeyListener( new KeyAdapter()
{
public void keyPressed(KeyEvent e) {
System.out.println("I am here.....");
}
});
}
Try this construtor and modify your jump, increment
and decrement
logic accordingly !!!!
You need to add listener to the frame and not to the panel.
int x_Pos = 30;
int y_Pos = 15;
ControlledBall() {
JFrame fr = new JFrame("Controlled Ball");
this.setBackground(Color.black);
fr.add(this);
fr.setVisible(true);
fr.setSize(600, 400);
fr.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent ke) {
if (ke.getKeyCode() == ke.VK_RIGHT) {
System.out.println("Right Key");
increment();
} else if (ke.getKeyCode() == ke.VK_LEFT) {
System.out.println("Left Key");
decrement();
} else if (ke.getKeyCode() == ke.VK_UP) {
System.out.println("Up Key");
jump();
}
}
});
y_Pos = this.getHeight() - diameter;
//register();
repaint();
}