Re: Swing - paintComponent not called
On Apr 8, 6:17 pm, "Matt Humphrey" <ma...@iviz.com> wrote:
"Bojan" <srbi...@gmail.com> wrote in messagenews:c7239492-1367-41cf-a00f-=
610dca79485d@e2g2000vbe.googlegroups.com...
On Apr 8, 1:13 pm, "Matt Humphrey" <ma...@iviz.com> wrote:
> "Bojan" <srbi...@gmail.com> wrote in message
>
>news:17546d5d-1f94-44d7-b556-c62efca334da@r3g2000vbp.googlegroups.co=
m...
>
> > Hi all,
>
> > For some reason the paintComponent is never called to print the
> > image. The image is valid, i have tested it with setIconImage(ima=
ge)
> > and it worked fine. Why is the paintComponent never called? Any h=
elp
> > would be appreciated. Thanks in Advance.
>
> > The ProgressFrame is called from a run method, which is in a clas=
s
> > that implements Runnable. Which is called by creating a new threa=
d.
>
> > Here is the code for the ProgressFrame:
>
> <snip>
>
> Works for me--draws the image (when main added.) Are you sure busy.=
jpg is in
> the correct location or that Resources is capitalized correctly? It=
is best
> also to launch the window from the EDT as in:
>
> SwingUtilities.invokeLater (new Runnable () {
> public void run () {
> ProgressFrame pf = new ProgressFrame ();
> }
> });
>
> Matt Humphreyhttp://www.iviz.com/
That does work. But I forgot to mention that I am calling the method
from actionPerformed(ActionEvent ae).
A main frame has menu items that correspond to actions. When one o=
f
them is executed it checks if ae.getSource equals to the menu item.
E.g.
JMenuItem source = (JMenuItem) ae.getSource();
if (source == open) {
openFile();
}
else if (...
When openFile is called, which creates the new thread... it does not
show the image.
Whoa! Hold on there! This is a completely different problem.
If you're creating a new thread, there are various constraints on how you=
can update the GUI from that thread. If you are attempting to do more t=
han repaint, revalidate or invalidate you should expect to have problems. =
Virtually all other Swing methods must take place on the EDT.
When you say you are "calling the method from actionPerformed" do you mea=
n paintComponent or some method --as yet not shown-- which invokes new Prog=
ressFrame () ? I'm guessing the latter in which case your main problem i=
s probably threading, but if not calling paintComponent is probably the wro=
ng thing to do anyway.
You will have to show what openFile does and explain how it connects to n=
ew ProgressFrame. At this point it would probably be best if you put tog=
ether a test program that actually demonstrates the problem (as opposed to =
the code you sent that does not.)
Matt Humphreyhttp://www.iviz.com/
Here is the test code that will address my problem. I have changed
the image to an image from the internet so that everyone will have it
the same.
FILE 1: This file is the place where the image should load, it is run
in a new thread.
public class ProgressFrame extends JFrame {
public ProgressFrame()
{
Container contentPane = this.getContentPane();
URL url = null;
try {
url = new URL("http://online.vodafone.co.uk/en_GB/assets/static/
ipi_please_wait.gif");
} catch (MalformedURLException e) {
e.printStackTrace();
}
Image image = new ImageIcon( url ).getImage();
setIconImage(image);//If the icon is changed, then so is image
should be displayed as well
DrawingPanel panel = new DrawingPanel(image);
contentPane.add(panel);
setTitle("Loading");
setSize(384, 230);
setResizable(false);
setVisible(true);
toFront();
}
public void close()
{
setVisible(false);
dispose(); //close the window
}
}
@SuppressWarnings("serial")
class DrawingPanel extends JPanel
{
Image img;
DrawingPanel (Image img)
{ this.img = img; }
public void paintComponent (Graphics g) {
super.paintComponent (g);
g.drawImage (img, 0, 0, this);
} // paintComponent
}
FILE 2: When the button is pressed, it creates a new thread, creates
ProgressFrame and keeps changing the title of the ProgressFrame.
public class MainFrame extends JFrame implements ActionListener{
private String statusTitle;
JButton button;
public MainFrame()
{
JPanel panel = new JPanel();
button = new JButton("Start Loading");
panel.add(button);
button.addActionListener(this);
Container contentPane = this.getContentPane();
contentPane.add(panel);
setTitle("Main Frame");
setSize(400, 200);
setVisible(true);
}
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();
}
}
}
File 3 Just creates the Main Frame.:
public class Runer {
public static void main(String[] args)
{
JFrame main = new MainFrame();
}
}