2014-11-18 3 views
-1

Я пытаюсь нарисовать несколько точек на изображении. Не все сразу, но один за другим с задержкой несколько мс? Я пробовал использовать таймер, но это только задерживает только начало рисования. Вот мой код, что не так?Java: временная задержка

ActionListener listener = new ActionListener() { 
    public void actionPerformed(ActionEvent ae) { 
       try { 
        Scanner in = new Scanner(new File("file.txt")); 
        while (in.hasNext()) { 
         String f = in.nextLine(); 
         String[] tokens = f.split(" "); 
         Map<String,String> map = new HashMap<>(); 
         map.put(tokens[3],tokens[4]); 
         int x=Integer.parseInt(tokens[3]); 
         int y=Integer.parseInt(tokens[4]); 
         Graphics g1 = bg.getGraphics(); 
         g1.drawImage(scaled, x, y, null); 
         g1.dispose(); 
         label.repaint(); 
        } 
       }catch ( FileNotFoundException | NumberFormatException i) { 
       } 
      } 
     }; 
     Timer timer = new Timer(500, listener); 
     timer.start(); 
+1

1. используйте «ScheduledExecutorService», это 2014; 2. зачем открывать новый сканер на каждом цикле? – fge

+1

Потому что он в учебной программе и не должен знать или использовать об ExcecutorServices? –

+2

, если у вас есть цикл, и вы хотите его замедлить (т. Е. Отложить рисование), тогда вы должны поместить код задержки в цикл. – DwB

ответ

2

Все графические операции должно быть сделано в потоке пользовательского интерфейса. Для этого вам следует использовать SwingTimer

class Painter implements ActionListener() { 
    int step = 0; 
    Timer = this.timer; 
    public void actionPerformed(ActionEvent ae) { 
    if (step > ...) timer.stop(); 
    switch (step) { 
     case 0 : ... ; break; 
     case 1 : ... ; break; 
    } 
    step = step + 1; 
    } 
} 

Timer timer = new Timer(new Painter(), 500); 
+1

+1:^это. Слава богу, здесь есть люди, которые знают, что параллелизм и время не связаны с вызовом 'Thread.sleep()' ... – vaxquis

0

Extract алгоритм рисования в новом потоке затем использовать Thread.sleep:

//Pause for 1 seconds 
Thread.sleep(1000); 
0

При использовании while(in.hasNext()) он просматривает все строки в файле, так что вы только задержать его в начале и затем он считывает все строки в 1 раз. Вы можете использовать Thread.sleep(500) под label.repaint();

0

Если вы хотите иметь задержку Inbetween каждой точки, вы должны задержать каждыйdrawImage вызова.

Таким образом, использовать что-то вроде

while (in.hasNext()) { 
    ... 
    g1.drawImage(scaled, x, y, null); 
    g1.dispose(); 
    label.repaint(); 
    Thread.sleep(1000); 
} 
Смежные вопросы