Java Swing:使用Thread.sleep()制作的动画无法正常工作

时间:2019-05-27 18:37:17

标签: java multithreading swing animation

我正在尝试创建一个滑动菜单栏,其中菜单栏的初始宽度为60px,在菜单图标按钮的ActionPerformed事件(三条小水平线Menu Icon)上,宽度最初增加到260px以下代码:

private void menuLabelBtnActionPerformed(java.awt.event.ActionEvent evt) {                                             
        if(menuToggle.isSelected()){
            menuToggle.setSelected(false);
            Thread th = new Thread(){
                public void run(){
                    try{
                        for(int i=259;i>=210;i=i-15){
                            Thread.sleep(1);
                            i--;
                            slideMenuPane.setBounds(slideMenuPane.getX(), slideMenuPane.getY(), i, slideMenuPane.getHeight());
                        }
                        for(int i=210;i>=110;i=i-35){
                            Thread.sleep(1);
                            i--;
                            slideMenuPane.setBounds(slideMenuPane.getX(), slideMenuPane.getY(), i, slideMenuPane.getHeight());
                        }
                        for(int i=110;i>=60;i=i-5){
                            Thread.sleep(1);
                            i--;
                            slideMenuPane.setBounds(slideMenuPane.getX(), slideMenuPane.getY(), i, slideMenuPane.getHeight());
                        }
                    }catch(Exception e){
                        System.out.println(e);      
                    }
                }
            };
            th.start();
        }
        else{
            menuToggle.setSelected(true);
            Thread th = new Thread(){
                public void run(){
                    try{
                        for(int i=61;i<=110;i=i+15){
                            Thread.sleep(1);
                            i++;
                            slideMenuPane.setBounds(slideMenuPane.getX(), slideMenuPane.getY(), i, slideMenuPane.getHeight());
                        }
                        for(int i=110;i<=210;i=i+35){
                            Thread.sleep(1);
                            i++;
                            slideMenuPane.setBounds(slideMenuPane.getX(), slideMenuPane.getY(), i, slideMenuPane.getHeight());
                        }
                        for(int i=210;i<=260;i=i+5){
                            Thread.sleep(1);
                            i++;
                            slideMenuPane.setBounds(slideMenuPane.getX(), slideMenuPane.getY(), i, slideMenuPane.getHeight());
                        }
                    }catch(Exception e){
                        System.out.println(e);      
                    }
                }
            };
            th.start();
        }
    }

其中menuToggle(包含在Other Components中)仅用于了解菜单栏是否已打开。 实际上,这是这样的:

Before Clicking the button After Clicking the button

但是,当我单击菜单图标按钮时,在动画开始前眨眼,它会显示宽度为60px的菜单栏,并且持续一毫秒。 无论如何,我可以删除眨眼吗?

1 个答案:

答案 0 :(得分:1)

Thread.Sleep()可能是导致此问题的原因。使用Swing计时器检查自上一次运行以来已花费了多少时间,不应暂停线程或创建Thread.Sleep()这样的图形问题。