Member 13946476 Ответов: 1

Может ли кто-нибудь помочь объяснить проблему с этим java-кодом


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;
	
	
	
//created an obj for the class Timer
	
Timer t=new Timer(5,this);

// created the x y coordinates and made the velocity variables 

	int x=0,y=0,velX=0,velY=0;
	
	//created the method and started the timer and added the KeyListener 
	
	public Ball() {
		t.start();
		addKeyListener(this);
		setFocusable(true);
		setFocusTraversalKeysEnabled(false);
		
	}
	//over rode the paint component method and created the obj that is gonna be controled by the arrow keys
	@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);
	}
	//Over rode the action performed method and gave the obj the ability to move
	@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();
	}
	//Over rode the key pressed method so as the user can control the obj by the arrow keys
	@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;
        }
	}
	//Over rode the key released method so as the obj would stop moving when the arrow keys are released
	@Override
	public void keyReleased(KeyEvent e) {
		velY=0;
		velX=0;
	}
	
	@Override
	public void keyTyped(KeyEvent e) {}
	
	//created the main window
	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.add(b);
	JOptionPane.showMessageDialog(null, "let's start\nif it doesn't work then re-run the program please", "message", JOptionPane.DEFAULT_OPTION);
}
}

теперь этот код должен просматривать круг в окне, которым можно управлять с помощью клавиш со стрелками
это хорошо работает
но проблема в том, что когда я запускаю его, иногда он не работает там, где мяч не движется
когда я перезапускаю его он работает отлично
может ли кто-нибудь дать мне объяснение и некоторые возможные исправления
Спасибо.

Что я уже пробовал:

Я не знаю в чем проблема поэтому хочу от вас ребята помочь

Richard MacCutchan

Я вообще не могу заставить это работать, и кажется, что нажатия клавиш вообще не захватываются. Есть ли какая-то дополнительная опция, которую вы используете при построении программы?

Member 13946476

нет просто попробуйте несколько раз иногда требуется 5-6 чтобы работать ИДК почему

если вы можете проверить код и если вы найдете некоторые возможные исправления пожалуйста помогите мне

Richard MacCutchan

Смотреть ниже.

1 Ответов

Рейтинг:
2

Richard MacCutchan

Приведенный ниже код, похоже, работает. Смотрите мои комментируемые строки, где я удалил или добавил какой-то код:

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;
	
	
	
//created an obj for the class Timer
	
Timer t=new Timer(10,this);

// created the x y coordinates and made the velocity variables 

	int x=0,y=0,velX=0,velY=0;
	
	//created the method and started the timer and added the KeyListener 
	
	public Ball() {
		t.start();
		addKeyListener(this);
// remove the following two lines here
//		setFocusable(true);
//		setFocusTraversalKeysEnabled(false);
		
	}
	//over rode the paint component method and created the obj that is gonna be controled by the arrow keys
	@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);
	}
	//Over rode the action performed method and gave the obj the ability to move
	@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();
	}
	//Over rode the key pressed method so as the user can control the obj by the arrow keys
	@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;
        }
	}
	//Over rode the key released method so as the obj would stop moving when the arrow keys are released
	@Override
	public synchronized void keyReleased(KeyEvent e) {
		velY=0;
		velX=0;
	}
	
	@Override
	public void keyTyped(KeyEvent e) {}
	
	//created the main window
	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);
// added the following three lines here
	frame.setFocusable(true);
	frame.setFocusTraversalKeysEnabled(false);
	frame.addKeyListener(b);
	frame.add(b);
	
    }
}