12

I have a swing application in which I display images in a JPanel. If the app is unable to produce the image I want to remove the previous one from the JPanel and replace it with a JTextField and message. I can add the text field , but it's drawn on top of the previous contents, which is itself a subclass of JPanel. Here's what I have:

private void displayMessage(String message) {
  JTextField tf = new JTextField(message);
  cdPanel.removeAll();
  cdPanel.add(tf, BorderLayout.NORTH);//tried lots of variations, inc. no layout    
  cdPanel.validate();
}

How can I get cdPanel to completely redraw itself?

jaybee
  • 1,897
  • 2
  • 16
  • 29
  • Had you tried calling `cdPanel.revalidate(); cdPanel.repaint()` instead of `cdPanel.validate()` ? Moreover, how are images displayed on this `JPanel`? Are you using `JLabel` or drawing them directly on the `JPanel` ? – nIcE cOw Aug 01 '13 at 17:54
  • 1
    @nIcEcOw thanks, that works perfectly. Please post so I can mark yours as the answer :-) – jaybee Aug 01 '13 at 18:18
  • You're MOST WELCOME and KEEP SMILING :-) But Please from next time, try to provide the information to the fullest, as if you are explaining it to a child, as to __What you doing ?__, __What you expecting ?__ and __What exactly happened ?__ This way, the person who is answering will be able to provide better insight regarding the given situation :-) – nIcE cOw Aug 01 '13 at 18:26

2 Answers2

27

You can simply try calling :

cdPanel.revalidate();
cdPanel.repaint();   // This is required in some cases

instead of

cdPanel.validate();
nIcE cOw
  • 24,468
  • 7
  • 50
  • 143
3

As you are dealing with unpredictable latency, use a SwingWorker to do the loading in the background, as shown here. The example uses pack() to resize the label to that of the image, but you may want to use a fixed-size grid and scale the images, as shown here.

Community
  • 1
  • 1
trashgod
  • 203,806
  • 29
  • 246
  • 1,045