PDA

View Full Version : [Java]Problema conto alla rovescia


dgiac
16-08-2010, 15:17
public class AutoKill extends JFrame {
private Container sfondo;
private JTextArea area;

public AutoKill(){
addWindowListener(new Ascoltatore());
setSize(400,400);
setResizable(false);
setTitle("AutoKill");
sfondo = getContentPane();
area = new JTextArea("");
area.setBounds(0,0,400,400);
area.setEditable(false);
sfondo.add(area);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setVisible(true);
} //AutoKill

protected class Ascoltatore extends WindowAdapter {
public void windowClosing(WindowEvent ev) {
try {
for(int i=5; i>0; i--) {
Thread.sleep(1000);
System.out.println(i);
area.setText(""+i);
} // for
} catch (Exception e) {}
} // windowClosing
} // Ascoltatore

public static void main(String[] args) {
AutoKill a = new AutoKill();
} // main

} // AutoKill

Perchè System.out.println(i); compare ogni secondo sul prompt e area.setText(""+i); compare solo alla fine???? Come devo fare per sistemarlo?

tuccio`
16-08-2010, 15:33
intanto dovresti usare l'edt per fare modifiche sugli oggetti swing, e poi dovresti usare un thread apposito per un'operazione di questo tipo

http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html

dgiac
16-08-2010, 15:41
Mai usata SwingWorker.. è pure astratta.. bel casino. qualche consiglio?? aiutino??

tuccio`
16-08-2010, 16:25
for(int i=5; i>0; i--) {
Thread.sleep(1000);
System.out.println(i);
area.setText(""+i);
JFrame f = (JFrame)ev.getComponent();
f.update(f.getGraphics());
} // for


un workaround veramente brutto

dgiac
16-08-2010, 16:30
PERO' FUNIONAAAA!!
Grazie milleeeee!!!:D
Ma praticamente crea un'altro JFrame con gli elementi dell'altro e lo aggiorna ogni volta? Giusto?

tuccio`
16-08-2010, 16:37
no getComponent ritorna il componente che ha generato l'evento, quindi è proprio il riferimento al tuo JFrame, non crea niente

tylerdurden83
16-08-2010, 20:49
Eccoti il programmino :)


import java.awt.event.*;
import javax.swing.*;
import java.util.List;

public class AutoKill extends JFrame {
private JTextArea area;

private class Countdown extends SwingWorker<Void, Integer> {
@Override protected Void doInBackground() {
for(int i=5; i>0; i--) {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {}
publish(i);
System.out.println(i);
}
return null;
}

@Override protected void process(List<Integer> listaDiInteri) {
Integer i = listaDiInteri.get(listaDiInteri.size() - 1);
area.setText(""+i);
}
}

public AutoKill(){
this.addWindowListener(new Ascoltatore());
this.setSize(400,400);
this.setResizable(false);
this.setTitle("AutoKill");
this.area = new JTextArea("");
this.area.setBounds(0,0,400,400);
this.area.setEditable(false);
this.getContentPane().add(area);
this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
this.setVisible(true);
}

protected class Ascoltatore extends WindowAdapter {
@Override public void windowClosing(WindowEvent ev) {
Countdown c = new Countdown();
c.execute();
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new AutoKill();
}
});
}
}