如何在不使用Timer的情况下实现平滑下降的JLabel,而是使用Threads

时间:2015-10-10 23:18:14

标签: java multithreading swing sleep

好吧,所以我有一个空格式JPanel,其中只有一个JLabelJLabel位于(0,0)。我尝试做的是在新的Thread中使用while循环来暂停新的Thread,然后使用JLabelSwingUtilities.invokeLater 10px向下移动。问题是UI以一种迟缓的方式得到更新。它不会每次都更新,但跳过大量更新和大块移位。我知道我可以使用Timer轻松完成,但重点是更好地理解Threads。提前谢谢!

代码:

private void start(){
    Updater up = new Updater();
    up.start();
}
public void updatePosition(){
    int y = label1.getLocation.y;
    label.setBounds(0,y+10, 10,10);
}
private class Updater extends Thread{
    public void run(){
        while(!shouldQuit){
            try{
                Updater.sleep(100);
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                       updatePosition(); 
                    }
                }); 
            }catch(Exception e){
                System.out.println(e);
            }      
        }   
    }
}

编辑: 我通过在updatePosition()方法中调用一个新的Thread实例来替换while循环来实现它,以便稍微解决问题。而且,它不仅仅是造成问题的线程,所以我不得不强制面板通过调用revalidate()来重新布局它的子视图。 这是它的外观(完全工作的):

private void start(){
    new Updater().start();
}
public void updatePosition(){
    int y = label1.getLocation.y;
    label.setBounds(0,y+10, 10,10);
    panel.revalidate();
    if(!shouldQuit) new Updater().start();
}
private class Updater extends Thread{
    public void run(){
        try{
            Updater.sleep(100);
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    updatePosition(); 
                }
            }); 
        }catch(Exception e){
            System.out.println(e);
        }   
    }
}

1 个答案:

答案 0 :(得分:0)

您应该尝试使用可见性和GridLayout来最大化移动。您可以使用int var来计算线程并将其与标签相互反复。同样,你应该使用你的能力o创建更新,更多,更顺畅。只需在拖动线程时执行start()mwthod: - )

除了无限通话之外你还可以开始。我认为你已经失去了班级本身的继承权。对象label1必须在战斗中丢失。如果那不是它,那么我很确定我真的不能回答这个问题。