好吧,所以我有一个空格式JPanel
,其中只有一个JLabel
。 JLabel
位于(0,0)。我尝试做的是在新的Thread
中使用while循环来暂停新的Thread
,然后使用JLabel
将SwingUtilities.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);
}
}
}
答案 0 :(得分:0)
您应该尝试使用可见性和GridLayout来最大化移动。您可以使用int var来计算线程并将其与标签相互反复。同样,你应该使用你的能力o创建更新,更多,更顺畅。只需在拖动线程时执行start()mwthod: - )
除了无限通话之外你还可以开始。我认为你已经失去了班级本身的继承权。对象label1
必须在战斗中丢失。如果那不是它,那么我很确定我真的不能回答这个问题。