因此,对于我们的班级,我们正在制作一个难以捉摸的球项目。基本上它是一个游戏,鼠标必须追逐圆圈直到用户得到它。但是在我的代码中,鼠标监听器正在识别鼠标移动,但它根本没有与圆形交互。球不是移动的时期。我不知道这是不是我的逻辑,或者我是否使用了错误的方法或什么。
package lab10;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Random;
import javax.swing.JFrame;
public class Lab10 extends JFrame implements MouseMotionListener{
int x = 325;
int y = 325;
int rX;
int rY;
public Lab10() {
super("The Elusive Circle");
addMouseMotionListener(this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(750,750);
setVisible(true);
}
public void paint(Graphics g) {
super.paint(g);
g.drawOval(getX(),getY(),80,80);
g.setColor(Color.MAGENTA);
g.fillOval(getX(),getY(),80,80);
}
public static void main (String args[]) {
Lab10 circle = new Lab10();
System.out.println("MY HEAD!");
}
public void mouseDragged (MouseEvent e) {
System.out.println("bacon pancakes");
}
public void mouseMoved (MouseEvent e) {
setCircle(e);
System.out.println("my head!!");
}
public void setCircle(MouseEvent m) {
int getx = m.getX();
int gety = m.getY();
Random r = new Random();
int rX = r.nextInt(700 - 51) + 51;
int rY = r.nextInt(700 - 51) + 51;
boolean getxInBounds = (getx == (rX+80));
boolean getyInBounds = (gety == (rY+80));
boolean getxInBounds2 = (getx == (rX-80));
boolean getyInBounds2 = (gety == (rY-89));
setX(rX);
setY(rY);
if(getxInBounds||getxInBounds2||getyInBounds||getyInBounds2){
repaint();
}
}
public void mouseClicked (MouseEvent e) {
System.out.println("Idk");
}
private void setX(int a) {
int x = a;
}
private void setY(int b) {
int y = b;
}
public int getX(){
return x;
}
public int getY() {
return y;
}
答案 0 :(得分:2)
您在paint方法中的 JFrame 上调用getX()
和getY()
,并且由于这些从未改变,因此球永远不会移动。为您的类提供MouseMotionListener设置的xPosition和yPosition字段,并在paint方法中使用这些字段。
编辑:你已经有了这些字段。设置rX和rY字段。请注意,请勿调用setX(...)
和setY(...)
,因为这些设置了组件的位置,而不是您的圈子,并且不提供GUI类getX()
和getY()
方法因为这些会覆盖组件的方法,导致令人讨厌的副作用。
顺便说一句,你最好不要在JFrame中显示的JPanel的paintComponent方法中绘制。
答案 1 :(得分:2)
除了@Hovercraft所说的,Swing is not thread safe和所有Swing代码都应该在Event Dispatch Thread上执行。在您的主要方法中,您应该execute the initialization on the EDT。
public static void main (String args[]) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Lab10 circle = new Lab10();
System.out.println("MY HEAD!");
}
});
}
否则,您的代码可能会出现#34;奇怪的错误"那些没有意义且无法调试的东西。