The code below seems to work. See my commented lines where I have removed or added some code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
public class Ball extends JPanel implements ActionListener,KeyListener {
private static final long serialVersionUID = -3622302774061996117L;
Timer t=new Timer(10,this);
int x=0,y=0,velX=0,velY=0;
public Ball() {
t.start();
addKeyListener(this);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(Color.WHITE);
g.setColor(new Color(66, 134, 244));
Graphics2D g2= (Graphics2D) g;
Ellipse2D circle=new Ellipse2D.Double(x,y,40,40);
g2.fill(circle);
}
@Override
public synchronized void actionPerformed(ActionEvent e) {
if(x<-40) {
velX=0;
x=600;
}
if(y<-40) {
velY=0;
y=600;
}
if(x>600) {
velX=0;
x=-40;
}
if(y>600) {
velY=0;
y=-40;
}
x+=velX;
y+=velY;
repaint();
}
@Override
public synchronized void keyPressed(KeyEvent e) {
int c=e.getKeyCode();
if(c==KeyEvent.VK_UP) {
velY=-3;
velX=0;
}
if(c==KeyEvent.VK_DOWN) {
velY=3;
velX=0;
}
if(c==KeyEvent.VK_RIGHT) {
velX=3;
velY=0;
}
if(c==KeyEvent.VK_LEFT) {
velX=-3;
velY=0;
}
}
@Override
public synchronized void keyReleased(KeyEvent e) {
velY=0;
velX=0;
}
@Override
public void keyTyped(KeyEvent e) {}
public static void main(String [] args) {
JFrame frame=new JFrame("moving ball");
Ball b=new Ball();
frame.setSize(600,600);
frame.setVisible(true);
frame.setResizable(false);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setFocusable(true);
frame.setFocusTraversalKeysEnabled(false);
frame.addKeyListener(b);
frame.add(b);
}
}