Re: Swing - paintComponent not called
On Apr 9, 11:14 am, "Matt Humphrey" <ma...@iviz.com> wrote:
"Bojan" <srbi...@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 upda=
ting
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 n=
ot
update while you are processing the menu selection. Launch your interr=
uptor
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 Humphreyhttp://www.iviz.com/
I did not use
SwingUtilities.invokeLater (new Runnable () {
pf.setTitle (---whatever---);
});
but everything else works perfectly.
Thanks a lot. I really appreciate it.