好了,所以我有一個空的佈局JPanel
在一個單一JLabel
。 JLabel
位於(0,0)。我正在試圖做的是使用while循環在新Thread
睡新Thread
,然後使用SwingUtilities.invokeLater
轉移JLabel
10px的下降。問題在於用戶界面以較差的方式進行更新。它不會每次都更新它,但會跳過大量更新並以大塊進行轉換。我知道我可以用Timer
輕鬆完成,但重點是更好地理解Threads
。提前致謝!如何實現一個平穩下降的JLabel不使用定時器,但是線程而不是
代碼:
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);
}
}
}
}
編輯: 我得到它通過與呼叫更換while循環到一個新的線程實例在updatePosition()
方法來工作,定居下來一點。而且,這不僅是導致問題的線程,所以我不得不迫使面板通過調用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);
}
}
}
*「如何實現一個平穩下降的JLabel不使用定時器,但是線程而不是」 *爲什麼「不定時」?爲什麼不在自定義的繪製面板中這樣做,而不是試圖在飛行中定位組件? –
計時器基於線程,所以我認爲應該有辦法做到這一點,這只是一個問題,我不知道解決方案,所以這使得它值得解決。你會如何建議我在一個自定義的彩色面板中進行操作? – vejmartin
*「你怎麼會建議我做一個定製的彩繪面板?」 *很像[此動畫(http://stackoverflow.com/a/14575043/418556),但繪畫字符串,而不是形狀。實際上(檢查)使用'BufferedImage'而不是自定義面板。但是一旦你擁有一個'Graphics'實例,它就是同一個主體。 –