我已經做了一個圓圈(在一個圓圈中),但現在我的應用程式不會繼續執行其他任務,因為我陷入了一個回圈。
我如何擺脫這種情況,并且仍然讓我的圈子在后臺移動?
- 我知道這是因為我一直在呼叫方法draw(); ,但我應該如何保持這個圓圈被繪制?
public class MyFrame extends JPanel {
int xc = 150, yc = 150, r = 100, diam = 50;
double inc = Math.PI/360, theta = 0;
public void draw(Graphics g) {
Timer timer = new Timer(0, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
theta = theta inc;
repaint();
System.out.println(theta);
}
});
timer.setDelay(20);
timer.start();
}
@Override
public void paint(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON ); //smooth the border around the circle
g2d.rotate(theta, xc, yc);
g2d.setColor(Color.blue);
g2d.drawOval(xc r - diam / 2, yc r - diam / 2, diam, diam);
draw(g);
}
}
uj5u.com熱心網友回復:
將回圈、計時器與繪畫分開。讓計時器改變關鍵變數的狀態,然后呼叫重繪。因此,您可以在繪畫方法之外(例如在建構式中)創建和啟動 Timer ,然后讓 paintComponent 專注于一件事和一件事,繪畫,而不是改變狀態:
public class MyPanel extends JPanel {
int xc = 150, yc = 150, r = 100, diam = 50;
double inc = Math.PI/360, theta = 0;
public MyPanel () {
Timer timer = new Timer(20, e -> {
theta = inc;
repaint();
});
timer.start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
g2d.rotate(theta, xc, yc);
g2d.setColor(Color.blue);
g2d.drawOval(xc r - diam / 2, yc r - diam / 2, diam, diam);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/474274.html
上一篇:將數字5列印為C中的反向模式
