Java 慢慢地把一个圆圈移动到某个地方

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

我试图让一个圆圈慢慢移动到某个地方,但它不起作用 在画布的重画之间,圆圈立即移动到某个地方,没有延迟,我不明白为什么。(在mouseUPListener中,圆圈应缓慢移动到其原始位置)

这是我的密码: 头等舱:

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();
}