Java 慢慢地把一个圆圈移动到某个地方
我试图让一个圆圈慢慢移动到某个地方,但它不起作用 在画布的重画之间,圆圈立即移动到某个地方,没有延迟,我不明白为什么。(在mouseUPListener中,圆圈应缓慢移动到其原始位置) 这是我的密码: 头等舱:Java 慢慢地把一个圆圈移动到某个地方,java,swt,Java,Swt,我试图让一个圆圈慢慢移动到某个地方,但它不起作用 在画布的重画之间,圆圈立即移动到某个地方,没有延迟,我不明白为什么。(在mouseUPListener中,圆圈应缓慢移动到其原始位置) 这是我的密码: 头等舱: import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class MouseListenerUsing {
static int i =0, R1=75,inCircleX=100,inCircleY=100,oldX,oldY;
static int outCircleX=inCircleX , outCircleY=inCircleY, R2=200,distX,distY,IT_NUM=100;
static Canvas c;
static Display display;
static boolean flagY=false,flagX=false;
static SecondClass se;
public static void main(String[] args) {
display = new Display();
Shell shell = new Shell(display);
shell.setSize(430, 460);
c=new Canvas(shell,SWT.BORDER);
c.setSize(370,380);
c.setLocation(21, 21);
c.addPaintListener(new PaintListener(){
public void paintControl(PaintEvent e) {
e.gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
e.gc.drawOval(outCircleX-((R2-R1)/2), outCircleY-((R2-R1)/2), R2, R2);
e.gc.fillOval(inCircleX, inCircleY, R1, R1);
}
});
c.addMouseMoveListener(new MouseMoveListener(){
@Override
public void mouseMove(MouseEvent e){
if (i==2)
{
if (Math.sqrt(Math.pow((inCircleX+(R1/2))-((outCircleX-((R2-R1)/2)+(R2/2))),2)+Math.pow((inCircleY+(R1/2))-((outCircleY-((R2-R1)/2))+(R2/2)),2))<=R2/2)
{ // distance between the two centers
inCircleX = e.x+oldX;
inCircleY = e.y+oldY;
c.redraw();
}
}
}
});
c.addMouseListener(new MouseListener() {
public void mouseDoubleClick(MouseEvent e) {}
public void mouseDown(MouseEvent e)
{
if (Math.sqrt(Math.pow(e.x-inCircleX-R1/2,2)+Math.pow(e.y-inCircleY-R1/2,2))<=R1/2)
{
oldX=inCircleX-e.x;
oldY=inCircleY-e.y;
i=2;
}
}
public void mouseUp(MouseEvent e)
{
if ((inCircleX+(R1/2))>(outCircleX-((R2-R1)/2)+(R2/2))) flagX=true;
else if ((inCircleX+(R1/2))<(outCircleX-((R2-R1)/2)+(R2/2))) flagX=false;
if ((inCircleY+(R1/2))>(outCircleY-((R2-R1)/2)+(R2/2))) flagY=true;
else if ((inCircleY+(R1/2))<(outCircleY-((R2-R1)/2)+(R2/2))) flagY=false;
distX = ((inCircleX+(R1/2))-((outCircleX-((R2-R1)/2)+(R2/2))))/IT_NUM;
distX = ((inCircleY+(R1/2))-((outCircleY-((R2-R1)/2)+(R2/2))))/IT_NUM;
se = new SecondClass();
display.timerExec(1000, se);
inCircleX = outCircleX;
inCircleY = outCircleY;
c.redraw();
i=1;
}
});
shell.open();
while(!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();
}
}
有人能给我解释一下我的问题并提出解决办法吗?
多谢各位
新代码:
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class MouseListenerUsing {
static int i =0, R1=75,inCircleX=100,inCircleY=100,oldX,oldY,count=0;
static int outCircleX=inCircleX , outCircleY=inCircleY, R2=200,distX,distY,IT_NUM=20;
static boolean flagY=false,flagX=false;
public static void main(String[] args) {
final Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(430, 460);
final Canvas c=new Canvas(shell,SWT.BORDER);
c.setSize(370,380);
c.setLocation(21, 21);
c.addPaintListener(new PaintListener(){
public void paintControl(PaintEvent e) {
e.gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
e.gc.drawOval(outCircleX-((R2-R1)/2), outCircleY-((R2-R1)/2), R2, R2);
e.gc.fillOval(inCircleX, inCircleY, R1, R1);
}
});
c.addMouseMoveListener(new MouseMoveListener(){
@Override
public void mouseMove(MouseEvent e){
if (i==2)
{
if (Math.sqrt(Math.pow((inCircleX+(R1/2))-((outCircleX-((R2-R1)/2)+(R2/2))),2)+Math.pow((inCircleY+(R1/2))-((outCircleY-((R2-R1)/2))+(R2/2)),2))<=R2/2)
{ // distance between the two centers
inCircleX = e.x+oldX;
inCircleY = e.y+oldY;
c.redraw();
}
}
}
});
c.addMouseListener(new MouseListener() {
public void mouseDoubleClick(MouseEvent e) {}
public void mouseDown(MouseEvent e)
{
if (Math.sqrt(Math.pow(e.x-inCircleX-R1/2,2)+Math.pow(e.y-inCircleY-R1/2,2))<=R1/2)
{
oldX=inCircleX-e.x;
oldY=inCircleY-e.y;
i=2;
}
}
public void mouseUp(MouseEvent e)
{
i=1;
if ((inCircleX+(R1/2))>(outCircleX-((R2-R1)/2)+(R2/2))) flagX=true;
else if ((inCircleX+(R1/2))<(outCircleX-((R2-R1)/2)+(R2/2))) flagX=false;
if ((inCircleY+(R1/2))>(outCircleY-((R2-R1)/2)+(R2/2))) flagY=true;
else if ((inCircleY+(R1/2))<(outCircleY-((R2-R1)/2)+(R2/2))) flagY=false;
//it = (Math.sqrt(Math.pow((inCircleX+(R1/2))-((outCircleX-((R2-R1)/2)+(R2/2))),2)+Math.pow((inCircleY+(R1/2))-((outCircleY-((R2-R1)/2))+(R2/2)),2))); //distance between centers
distX = ((inCircleX+(R1/2))-((outCircleX-((R2-R1)/2)+(R2/2))))/IT_NUM;
distY = ((inCircleY+(R1/2))-((outCircleY-((R2-R1)/2)+(R2/2))))/IT_NUM;
final Runnable drawThread = new Runnable()
{
@Override
public void run() {
if (flagX==true) inCircleX = inCircleX - distX;
if (flagX==false) inCircleX = inCircleX + distX;
if (flagY==true) inCircleY = inCircleY - distY;
if (flagY==false) inCircleY = inCircleY + distY;
c.redraw();
IT_NUM--;
System.out.println(IT_NUM);
if (IT_NUM==17)
{
display.timerExec(-1, this);
}
display.timerExec(10, this);
}
};
display.timerExec(10, drawThread);
//display.timerExec(-1, drawThread);
System.out.println("hello");
//inCircleX = outCircleX;
//inCircleY = outCircleY;
c.redraw();
}
});
shell.open();
while(!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();
}
}
import org.eclipse.swt.swt;
导入org.eclipse.swt.events.MouseEvent;
导入org.eclipse.swt.events.MouseListener;
导入org.eclipse.swt.events.MouseMoveListener;
导入org.eclipse.swt.events.PaintEvent;
导入org.eclipse.swt.events.PaintListener;
导入org.eclipse.swt.widgets.Canvas;
导入org.eclipse.swt.widgets.Display;
导入org.eclipse.swt.widgets.Shell;
公共类鼠标侦听器使用{
静态整数i=0,R1=75,inCircleX=100,inCircleY=100,oldX,oldY,count=0;
静态int outCircleX=inCircleX,outCircleY=inCircleY,R2=200,distX,distY,IT_NUM=20;
静态布尔flagY=false,flagX=false;
公共静态void main(字符串[]args){
最终显示=新显示();
外壳=新外壳(显示);
外壳尺寸(430460);
最终画布c=新画布(外壳、SWT.边框);
c、 设置大小(370380);
c、 设定位置(21,21);
c、 addPaintListener(新的PaintListener(){
公共无效油漆控制(油漆事件e){
e、 gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
e、 gc.drawOval(outCircleX-((R2-R1)/2)、outCircleY-((R2-R1)/2)、R2、R2);
e、 gc.fillOval(inCircleX,inCircleY,R1,R1);
}
});
c、 addMouseMoveListener(新的MouseMoveListener(){
@凌驾
公共无效mouseMove(MouseEvent e){
如果(i==2)
{
如果(Math.sqrt(Math.pow((inCircleX+(R1/2))-((outCircleX-((R2-R1)/2)+(R2/2)),2)+Math.pow((inCircleY+(R1/2))-((outCircleY-((R2-R1)/2))((R2))这是一个简单的示例。它将从左上到右下移动一个圆:
private static int x = 0;
private static int y = 0;
private static int r = 5;
// The timer interval in milliseconds
private static final int TIMER_INTERVAL = 10;
public static void main(String[] args)
{
final Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Canvas canvas = new Canvas(shell, SWT.NONE);
canvas.addListener(SWT.Paint, new Listener()
{
@Override
public void handleEvent(Event e)
{
e.gc.drawOval(x++, y++, r, r);
}
});
final Runnable drawThread = new Runnable()
{
@Override
public void run()
{
canvas.redraw();
if(x < 400 && y < 400)
display.timerExec(TIMER_INTERVAL, this);
}
};
display.timerExec(TIMER_INTERVAL, drawThread);
shell.pack();
shell.setSize(400, 400);
shell.open();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
// Kill the timer
display.timerExec(-1, drawThread);
display.dispose();
}
private static int x=0;
私有静态int y=0;
私有静态int r=5;
//计时器间隔(以毫秒为单位)
专用静态最终整数计时器间隔=10;
公共静态void main(字符串[]args)
{
最终显示=新显示();
外壳=新外壳(显示);
setLayout(新的FillLayout());
最终画布=新画布(shell,SWT.NONE);
addListener(SWT.Paint,new Listener())
{
@凌驾
公共无效handleEvent(事件e)
{
e、 gc.drawOval(x++,y++,r,r);
}
});
最终可运行drawThread=新可运行()
{
@凌驾
公开募捐
{
canvas.redraw();
如果(x<400&&y<400)
display.timerExec(TIMER\u INTERVAL,this);
}
};
display.timerExec(定时器间隔、抽丝);
shell.pack();
外壳设置尺寸(400400);
shell.open();
而(!shell.isDisposed())
如果(!display.readAndDispatch())
display.sleep();
//停止计时
display.timerExec(-1,drawThread);
display.dispose();
}
您可以开始使用计时框架来更好地控制动画
及
两者都很好。Trident支持SWT(是的,它在内部使用Display.timerExec())谢谢!我会尽力理解的it@user3061943很好,如果你觉得我的答案解决了你的问题,请投票并接受它。它仍然不起作用-可能是因为它在我程序的侦听器中?看起来重画函数只被调用了一次,Runnable类的Run函数也是如此drawThread@user3061943做您再次从内部计划可运行?我的代码是否为您工作?
private static int x = 0;
private static int y = 0;
private static int r = 5;
// The timer interval in milliseconds
private static final int TIMER_INTERVAL = 10;
public static void main(String[] args)
{
final Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Canvas canvas = new Canvas(shell, SWT.NONE);
canvas.addListener(SWT.Paint, new Listener()
{
@Override
public void handleEvent(Event e)
{
e.gc.drawOval(x++, y++, r, r);
}
});
final Runnable drawThread = new Runnable()
{
@Override
public void run()
{
canvas.redraw();
if(x < 400 && y < 400)
display.timerExec(TIMER_INTERVAL, this);
}
};
display.timerExec(TIMER_INTERVAL, drawThread);
shell.pack();
shell.setSize(400, 400);
shell.open();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
// Kill the timer
display.timerExec(-1, drawThread);
display.dispose();
}