簡體   English   中英

Java Swing-使用Swing Timer類移動JLabel

[英]Java Swing - Moving JLabels using Swing Timer class

我試圖根據鼠標的移動(當鼠標進入和退出時)移動這兩個JLabel對象( label_2label_3 )。 詳細地說,我的目標是當鼠標懸停在label_1 label_2label_3應該移至特定坐標。 退出鼠標時,這兩個標簽( label_2label_3 )應等待一小段時間,然后按照第一個動畫的相反label_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();
            }
        });

謝謝。

您不應在EDT上使用Thread.sleep()和Timer。 計時器代碼也不會在EDT上執行,因此也會引起問題。 它將導致您看到的不可預測的行為。 我建議對Swing教程中的並發性進行一下研究: http : //docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM