我的目標是繪製矩形並使用Observer模式從左至右平滑地移動它。帶觀察者模式的Java Swing多線程管理
我有一個Model類,它是Observable放置矩形的座標,Display類是Observer,每次模型中的座標改變時執行重繪。
模型中的座標變化是在SwingWorker中的while循環中進行的:在每次迭代中,我將x座標增加1,然後休眠100 ms,然後通知觀察者(顯示器)哪個任務是執行重繪。正如你所看到的那樣,在EDT上調用repaint()方法就像它被建議做的那樣。
問題是移動大約一秒後不平滑,重繪頻率改變,看起來矩形越來越少重新繪製。
這裏是模型類:
import java.util.Observable;
import java.awt.EventQueue;
import javax.swing.SwingWorker;
public class Model extends Observable{
int xCoordinate;
Model(Display d){
SwingWorker<Void,Void> sw = new SwingWorker<Void,Void>(){
@Override
protected Void doInBackground() {
while(xCoordinate<600){
xCoordinate ++;
try {
Thread.sleep(100);
} catch (InterruptedException ex) {}
setChanged();
notifyObservers(xCoordinate);
}
return null;
}
};
addObserver(d);
sw.execute();
}
public static void main(String[] a){
EventQueue.invokeLater(new Runnable(){
@Override
public void run(){
Display d = new Display();
Model m = new Model(d);
d.model = m;
}
});
}
}
這裏是Display類:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Display extends JFrame implements Observer{
Model model;
int xCoordinate;
Display(){
getContentPane().add(new JPanel(){
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(xCoordinate, 1, 50, 50);
}
});
setSize(600, 600);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
/* arg is the updated xCoordinate*/
public void update(Observable o, Object arg) {
xCoordinate = (Integer)arg;
EventQueue.invokeLater(new Runnable(){
@Override
public void run() {
repaint();
}
});
}
}
我嘗試過其他方法,例如在利用顯示計時器,但沒有奏效無論是。 SwingWorker可能在這裏沒有用,因爲在SwingWorker線程上進行的計算很容易(增加1),但是我將需要它來執行我打算在我的項目(池遊戲)上進行的繁重計算。
我也嘗試通過查看兩次重新繪製之間的時間(在Display中)和兩次遞增之間的時間(模型中)來調試,並且它的預期時間約爲100 ms。
在此先感謝
你可以改變的睡眠時間?嘗試10毫秒,它會移動更順利。 – ahoxha
那麼它仍然不流暢(至少在我的電腦上)。我試了10和500毫秒。 – Alsvartr
我嘗試了一個使用'javax.swing.Timer'的例子,但將延遲設置爲100毫秒,它不能平穩移動。以下是示例:http://www.java2s.com/Tutorial/Java/0240__Swing/Timerbasedanimation.htm。 – ahoxha