Я пытаюсь заставить круг медленно перемещаться в определенном месте, но он не работает круг перемещается в это место незамедлительно без задержек между перерисовыванием холста и i не понимаю почему. (В 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();
}
}
ВТОРОЙ КЛАСС:
public class SecondClass implements Runnable{
static int i =MouseListenerUsing.IT_NUM;
@Override
public void run() {
Surfing();
}
public void Surfing()
{
if (i>0){
if (MouseListenerUsing.flagX==true) MouseListenerUsing.inCircleX = MouseListenerUsing.inCircleX - MouseListenerUsing.distX;
if (MouseListenerUsing.flagX==false) MouseListenerUsing.inCircleX = MouseListenerUsing.inCircleX + MouseListenerUsing.distX;
if (MouseListenerUsing.flagY==true) MouseListenerUsing.inCircleY = MouseListenerUsing.inCircleY - MouseListenerUsing.distY;
if (MouseListenerUsing.flagY==false) MouseListenerUsing.inCircleY = MouseListenerUsing.inCircleY + MouseListenerUsing.distY;
MouseListenerUsing.c.redraw();
i--;
}
if (i==0)
{
MouseListenerUsing.display.timerExec(-1, MouseListenerUsing.se);
}
}
}
Может кто-нибудь объяснить мне мой проблемы и предложить soloution? Спасибо
новый код:
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();
}
}
Спасибо! Я постараюсь это понять – user3061943
@ user3061943 Отлично, если вы чувствуете, что мой ответ решил ваш вопрос, пожалуйста, поддержите его и примите. – Baz
все еще не работает - может быть, потому, что это в слушателе в моей программе? – user3061943