Warum ist paint()/paintComponent() nie aufgerufen wird?

Für die letzten zwei Tage habe ich versucht, verstehen wie Java-Griffe Grafiken, aber haben kläglich versagt, genau. Mein Hauptproblem ist das Verständnis genau, wie und Wann paint() (oder die neuere paintComponent() ) ist/aufgerufen werden soll.

In der folgende code, den ich gemacht, um zu sehen, wenn die Dinge geschaffen sind, wird die paintComponent() wird nie aufgerufen, wenn ich manuell einen Anruf hinzufügen, bis es mich oder Aufrufe von JFrame.paintAll()/JFrame.paintComponents().

Umbenannt habe ich die paint () - Methode paintComponent() in der Hoffnung, dass mein problem beheben würde es nie aufgerufen wird (auch bei repaint()), aber kein Glück.

package jpanelpaint;

import java.awt.*;
import javax.imageio.*;
import javax.swing.*;
import java.io.*;
import java.util.ArrayList;

public class ImageLoadTest extends JComponent {
 ArrayList<Image> list;

 public ImageLoadTest() {
  list = new ArrayList<Image>();

  try { //create the images (a deck of 4 cards)
   for(String name : createImageFileNames(4)){
    System.err.println(name);
    list.add(ImageIO.read(new File(name)));
   }
  } catch (IOException e) {  }
 }

    protected void paintComponent(Graphics g) {
     int yOffset=0;
  System.err.println("ImageLoadTest.paintComponent()");
     for(Image img : list) {
      g.drawImage(img, 0, yOffset,  null);
      yOffset+=20;
     }
    }

 public static void main(String args[]) throws InterruptedException {
  JFrame frame = new JFrame("Empty JFrame");
  frame.setSize(new Dimension(1000, 500));
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  frame.setVisible(true);

  Thread.sleep(1000);
  frame.setTitle("Loading images");
  ImageLoadTest ilt = new ImageLoadTest();
  frame.add(ilt);
  //update the screen
  //DOESN'T WORK. only works if I call frame.paintAll(frame.getGraphics()) 
  ilt.repaint();
  frame.repaint();

  Thread.sleep(1000);
  frame.setTitle("Setting background");
  ilt.setBackground(Color.BLACK);
  //update the screen - DOESN'T WORK even if I call paintAll ..
  ilt.repaint();
  frame.repaint();

            //have to call one of these to get anything to display  
// ilt.paintComponent(frame.getGraphics()); //works
  frame.paintComponents(frame.getGraphics()); //works
 }

 //PRIVATE HELPER FUNCTIONS

 private String[] createImageFileNames(int count){
  String[] fileNames = new String[count];
  for(int i=0; i < count; i++)
   fileNames[i] = "Cards" + File.separator + (i+1) + ".bmp";  
  return fileNames;
 }
}
InformationsquelleAutor oligofren | 2009-11-04
Schreibe einen Kommentar