Swing e EDT

Pelo que eu entendi, todos os Event Listeners e métodos que atualizam a GUI são chamados na Event Dispatch Thread. Então porque o código 1 não funciona, mas o código 2 funciona?

Nesse código a JProgressBar não atualiza. button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (int i = 0 ; i < 99999999 ; i++) progressbar.setValue(i); } }

Nesse código a JProgressBar atualiza. button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SwingWorker<Void,Void> worker = new SwingWorker<Void, Void> { protected Void doInBackground() { for (int i = 0 ; i < 99999999 ; i++) progressbar.setValue(i); return null; } } worker.execute(); } }
Mas se o primeiro está na EDT, então qual é o problema?

Também não entendi muito bem quando é necessário usar InvokeLater, se eu já fazia GUIs antes de saber que essa função existia e elas apareciam normalmente.