JPanel removeAll doesn't get rid of previous c

2020-02-12 02:02发布

问题:

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?

回答1:

You can simply try calling :

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

instead of

cdPanel.validate();


回答2:

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.