Java Swing - 使用 Swing 定时器移动 JLabels class
Java Swing - Moving JLabels using Swing Timer class
我试图根据鼠标移动(当鼠标进入和退出时)移动这两个 JLabel 对象(label_2
和 label_3
)。
详细地说,我的目标是当鼠标悬停在 label_1
上时,label_2
和 label_3
应该移动到特定坐标。当鼠标退出时,这两个标签(label_2
和 label_3
)应该等待一小段时间,然后反向执行他们在第一个动画中所做的动画。
但是,我遇到的问题是,每当鼠标退出而不是等待时,label_2
和 label_3
对象会在其初始位置和最终位置之间振荡。如何解决这个问题?
这是我的部分代码(抱歉,实际代码很长):
label_1.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
Point inputDest = new Point( 76, 111);
Point toolDest = new Point( 172, 24);
timer = new Timer( 10, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
Point pointKeyboard = label_2.getLocation();
Point pointTool = label_3.getLocation();
if( pointTool.x != 172 )
pointTool.x -= 7;
if( pointTool.y != 24 )
pointTool.y -= 12;
if( pointKeyboard.x != 76 )
pointKeyboard.x -= 14;
if( pointKeyboard.y != 111 )
pointKeyboard.y -= 3;
label_2.setLocation(pointKeyboard);
label_3.setLocation(pointTool);
repaint();
}
});
timer.start();
if( label_2.getLocation() == inputDest && label_3.getLocation() == toolDest )
timer.stop();
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
@Override
public void mouseExited(MouseEvent e) {
Point inputDest = new Point( 174, 132);
Point toolDest = new Point( 221, 108);
timer = new Timer( 10, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
Point pointKeyboard = label_2.getLocation();
Point pointTool = label_3.getLocation();
if( pointTool.x != 221 )
pointTool.x += 7;
if( pointTool.y != 108 )
pointTool.y += 12;
if( pointKeyboard.x != 174 )
pointKeyboard.x += 14;
if( pointKeyboard.y != 132 )
pointKeyboard.y += 3;
label_2.setLocation(pointKeyboard);
label_3.setLocation(pointTool);
repaint();
}
});
timer.start();
if( label_2.getLocation() == inputDest && label_3.getLocation() == toolDest )
timer.stop();
}
});
谢谢。
您不应在 EDT 上使用 Thread.sleep() 和 Timer。计时器代码也不会在 EDT 上执行,因此也会导致问题。这将导致您看到不可预知的行为。我建议看一下 Swing 教程中的并发性:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html
我试图根据鼠标移动(当鼠标进入和退出时)移动这两个 JLabel 对象(label_2
和 label_3
)。
详细地说,我的目标是当鼠标悬停在 label_1
上时,label_2
和 label_3
应该移动到特定坐标。当鼠标退出时,这两个标签(label_2
和 label_3
)应该等待一小段时间,然后反向执行他们在第一个动画中所做的动画。
但是,我遇到的问题是,每当鼠标退出而不是等待时,label_2
和 label_3
对象会在其初始位置和最终位置之间振荡。如何解决这个问题?
这是我的部分代码(抱歉,实际代码很长):
label_1.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
Point inputDest = new Point( 76, 111);
Point toolDest = new Point( 172, 24);
timer = new Timer( 10, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
Point pointKeyboard = label_2.getLocation();
Point pointTool = label_3.getLocation();
if( pointTool.x != 172 )
pointTool.x -= 7;
if( pointTool.y != 24 )
pointTool.y -= 12;
if( pointKeyboard.x != 76 )
pointKeyboard.x -= 14;
if( pointKeyboard.y != 111 )
pointKeyboard.y -= 3;
label_2.setLocation(pointKeyboard);
label_3.setLocation(pointTool);
repaint();
}
});
timer.start();
if( label_2.getLocation() == inputDest && label_3.getLocation() == toolDest )
timer.stop();
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
@Override
public void mouseExited(MouseEvent e) {
Point inputDest = new Point( 174, 132);
Point toolDest = new Point( 221, 108);
timer = new Timer( 10, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
Point pointKeyboard = label_2.getLocation();
Point pointTool = label_3.getLocation();
if( pointTool.x != 221 )
pointTool.x += 7;
if( pointTool.y != 108 )
pointTool.y += 12;
if( pointKeyboard.x != 174 )
pointKeyboard.x += 14;
if( pointKeyboard.y != 132 )
pointKeyboard.y += 3;
label_2.setLocation(pointKeyboard);
label_3.setLocation(pointTool);
repaint();
}
});
timer.start();
if( label_2.getLocation() == inputDest && label_3.getLocation() == toolDest )
timer.stop();
}
});
谢谢。
您不应在 EDT 上使用 Thread.sleep() 和 Timer。计时器代码也不会在 EDT 上执行,因此也会导致问题。这将导致您看到不可预知的行为。我建议看一下 Swing 教程中的并发性:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html