尝试实现允许用户绘制线条的拖动行为。
public void mousePressed(MouseEvent e) {
int index = clickedBall(e.getX(),e.getY());
if(index!=-1){
MainWindow.inFocusBall = index;
lx1 = TestPlay.balls.get(index).getX()+TestPlay.balls.get(index).getRadius()/2;
ly1 = TestPlay.balls.get(index).getY()+TestPlay.balls.get(index).getRadius()/2;
System.out.println("Line Start:"+lx1+","+ly1);
BallProp.update();
}
isPressed = true;
drawLine = true;
}
public void mouseMoved(MouseEvent e) {
if(isPressed){
System.out.println("MouseMoved");
int index = MainWindow.inFocusBall;
if(index!=-1){
MainWindow.inFocusBall = index;
lx1 = TestPlay.balls.get(index).getX()+TestPlay.balls.get(index).getRadius()/2;
ly1 = TestPlay.balls.get(index).getY()+TestPlay.balls.get(index).getRadius()/2;
BallProp.update();
}
lx2 = e.getX();
ly2 = e.getY();
repaint();
}
}
public void mouseReleased(MouseEvent e) {
isPressed = false;
drawLine = false;
System.out.println("MouseRelased");
//TestPlay.balls.get(MainWindow.inFocusBall);
}
此代码的输出是MousePressed - > MouseRelased。
更多细节(如果您理解代码不读)。
这里的想法是,当按下鼠标时,它会计算它是否按下了一个图形对象(在这种情况下是球),如果是这样的话,它会将指数(球阵列中的索引)设置为按下的球,它还设置将从圆心绘制到其坐标的线的起点。
鼠标移动如果isPressed为true,则将标志drawLine设置为true(绘图组件用于绘制线条),该线条从球的中心绘制到当前鼠标位置,在鼠标释放时,绘制线和ispressed被设置为false。
public void paintComponent(Graphics g) {
super.paintComponent(g);
drawBalls(g);
if(drawLine){
g.setColor(Color.BLACK);
g.drawLine(lx1, ly1, lx2, ly2);
}
}
public void drawBalls(Graphics g){
for(int x=0;x<TestPlay.balls.size();x++){
g.setColor(TestPlay.balls.get(x).getColor());
g.fillOval(TestPlay.balls.get(x).getX(), TestPlay.balls.get(x).getY(), TestPlay.balls.get(x).getRadius(), TestPlay.balls.get(x).getRadius());
}
}
答案 0 :(得分:1)
您应该尝试实现mouseDragged():
public void mouseDragged(MouseEvent e) {
System.out.println("mouseDragged: " + e.getX() + " , " + e.getY());
}