2015-03-20 4 views
1

Я пытаюсь переместить эти два объекта JLabel (label_2 и label_3) в соответствии с движением мыши (когда мышь входила и выходила). Подробно, моя цель - навести курсор мыши на label_1, тогда label_2 и label_3 должны переместиться в определенные координаты. Когда мышь выйдет, эти две метки (label_2 и label_3) должны подождать некоторое короткое время, а затем выполнить обратную анимацию, что они сделали в первой анимации.Java Swing - Перемещение JLabels с использованием Swing Timer class

Однако проблема, с которой я столкнулся, заключается в том, что всякий раз, когда мышь выходила, вместо ожидания, объекты 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(); 
      } 
     }); 

Спасибо.

ответ

2

Вы не должны использовать Thread.sleep() и Timer на EDT. Код по таймеру также не выполняется на EDT, так что это также вызовет проблемы. Это приведет к непредсказуемому поведению вашего видения. Я предлагаю взглянуть на параллелизм в учебнике Swing: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html