Re: Swing - paintComponent not called
"Bojan" <srbijan@gmail.com> wrote in message
news:bdcbed58-f760-492c-b6d9-12762202bc5d@21g2000vbk.googlegroups.com...
On Apr 8, 6:17 pm, "Matt Humphrey" <ma...@iviz.com> wrote:
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button)
{
Thread a = new Thread (new Runnable () {
public void run () {
ProgressFrame pf = new ProgressFrame();
int counter = 0;
//Just to show that the window is doing something
try {
while (true)
{
Thread.sleep(200);
pf.setTitle(pf.getTitle() + ".");
counter++;
if (counter==4)
{
counter = 0;
pf.setTitle(statusTitle);
}
}
} catch (InterruptedException e) {
pf.close();
}
}
});
statusTitle = "Loading";
a.start();
try {
//This is supposed to represent some actions that the main class
will do
Thread.sleep(10000);
} catch (InterruptedException e1) {
}
a.interrupt();
}
}
}
-------------------------------------------
Ok, the main troubles I see are:
you are launching a new window in a non-EDT thread,
you are updating that window from a non-EDT thread
you are blocking the EDT with a sleep so no updates / drawing will occur.
To create the window in the EDT--just move the ProgressFrame creation
outside of the loop (mark the local variable pf as final). As for updating
the title, it is probably not part of your main problem, but you should
instead use (uncompiled, untested)
SwingUtilities.invokeLater (new Runnable () {
pf.setTitle (---whatever---);
});
As for blocking the EDT with sleep--keep in mind that all GUI updates
(redrawing, handing events, etc) take place on the EDT--the screen will not
update while you are processing the menu selection. Launch your interruptor
into a separate thread where it can wait while the EDT gets back to work.
Mark local variable "a" as final.
Thread interruptor = new Thread (new Runnable () {
try {
Thread.sleep (10000);
} catch (InterruptedException ex) {
ex.printStackTrace (); // Never leave this empty
}
a.interrupt ();
});
interruptor.start ();
// Return back to EDT so it can do its job
Matt Humphrey http://www.iviz.com/