Java Swing - 使用Swing Timer类移动JLabel

时间:2015-03-20 15:04:47

标签: java swing animation timer jlabel

我正在尝试根据鼠标移动(鼠标进入和退出时)移动这两个JLabel对象(label_2label_3)。 详细地说,我的目标是当鼠标悬停在label_1之后,然后label_2label_3应移动到特定坐标。退出鼠标时,这两个标签(label_2label_3)应该等待很短的时间,然后反向执行他们在第一个动画中所做的动画。

然而,我遇到的问题是,只要鼠标退出,而不是等待,label_2label_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();
            }
        });

谢谢。

1 个答案:

答案 0 :(得分:2)

你不应该在EDT上使用Thread.sleep()和Timer。定时器代码也不会在EDT上执行,因此也会导致问题。它会导致你看到的不可预测的行为。我建议看看Swing教程中的并发性:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html

相关问题