Вы неверно истолковали способ работы Graphics
.Вы не можете просто «задержать» рендеринг, рисуя что-то позже.Это либо задержит ваш поток рендеринга, либо вообще не будет отображаться на экране.
Причина этого в том, что рисование всех ваших перекрашенных компонентов должно быть завершено до того, как рендеринг будет выполнен.Однако, если вы постепенно нарисуете линию, весь процесс будет ждать, пока цикл не прекратится, чтобы программа продолжила (и линию, которая будет показана).Думайте о методе рисования как о затворе камеры.Вы делаете быструю картинку, а не видео.Поэтому для того, чтобы что-то «двигалось» или рисовалось медленно, вам нужно расположить много картинок в последовательности, как в фильме.
То, что вы на самом деле хотите, это периодически перерисовывать Panel (вам нужна частота кадров).Например, если вы хотите рендерить с частотой, близкой к 30 кадрам в секунду, вы можете сделать следующее:
public class AutoUpdatedPanel extends javax.swing.JPanel {
Thread t;
float linePercent = 0f;
public AutoUpdatedPanel () {
t = new AutoUpdateThread();
t.start();
}
public void paint(java.awt.Graphics g) {
g.setColor(Color.GREEN);
g.fillRect(0, 0, 500, 500);
g.setColor(Color.BLACK);
int linePos = (int) 5 * linePercent;
g.fillRect(linePos, linePos, 5, 5);
}
public class AutoUpdateThread extends java.lang.Thread {
public void run() {
while (!isInterrupted()) {
try {
Thread.sleep(33);
} catch (InterruptedException e) {
// silent.
}
linePercent += .5f;
linePercent = math.min(linePercent, 100f);
AutoUpdatedPanel.this.repaint();
}
}
}
}
Однако я бы посоветовал сделать рост строки на основе времени:
...
public class AutoUpdateThread extends java.lang.Thread {
public void run() {
while (!isInterrupted()) {
try {
Thread.sleep(33);
} catch (InterruptedException e) {
// silent.
}
nowMillis = Calendar.newInstance().getTimeInMillis();
long timeOffset = nowMillis - start;
linePercent = (float) (.002d * timeOffset);
linePercent = math.min(linePercent, 100f);
AutoUpdatedPanel.this.repaint();
}
}
}