2016-05-21 3 views
1

Ich versuche derzeit eine einfache Animation in Java zu realisieren. Ich habe ein Panel, in dem ich ein BufferedImage drucken möchte. Ich stelle den Bildort an einem Punkt ein und stelle seine Abmessungen ein.Java Swing: Grafische Komponente erscheint nur in der oberen linken Ecke Zone

Es ist jedoch so, als würde ich die "Druckzone" meines Bildes oben links mit seinen Abmessungen platzieren, und nur der Teil meines Bildes, der zu dieser Druckzone gehört, wird gezeichnet, wie Sie auf der folowing Bild:

http://i.stack.imgur.com/CRmCv.png

ich denke, es propably eine grundlegende Dinge ist mir fehlt aber ich kann keine Antwort entsprechend meinem Problem finden, und ich bin ein beginer in Java so ..

Hier die ist Teil meines Codes, der sich auf dieses Problem bezieht:

public abstract class ObjetAnime extends JPanel{ 
protected Point location; 
protected Dimension dim; 
protected BufferedImage picture; 

ObjetAnime(ObjetsPropriete objetProp) 
{ 
    location = new Point(10,10); 
    dim = objetProp.getDimension(); 
    try { 
     picture = ImageIO.read(new File(objetProp.getPath())); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

    this.setSize(dim); 
    this.setLocation(location); 
    this.setLayout(null); 
    this.setOpaque(false); 
} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
     RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 

    if (picture != null) { 
    g.drawImage(picture, location.x, location.y, this); 
    } 
} 

Und in der Superklasse I haben:

public ListeObjets(GConfig gconfig, GPanel jeuPanel) 
{ 
    setListeObjets(new ArrayList<ObjetAnime>()); 
    panel = jeuPanel; 
    for(int i = 0; i < gconfig.getObjetsTab().length; ++i) 
    { 
     switch(gconfig.getObjetsTab()[i].getType()) 
     { 
      case ROND: 
       getListeObjets().add(new Rond(gconfig.getObjetsTab()[i])); 
      break; 
     } 
    } 
    addToPanel(panel); 
} 

public void addToPanel(GPanel jeuPanel) { 
    jeuPanel.setLayout(null); 
    Iterator iterator = getListeObjets().iterator(); 
    ObjetAnime obj = (ObjetAnime) iterator.next(); 
    jeuPanel.add(obj, obj.location); 
    while(iterator.hasNext()) 
    { 
     obj = (ObjetAnime) iterator.next(); 
     jeuPanel.add(obj, obj.location); 
    } 
    System.out.println(obj); 

} 

Und die Objekteigenschaften sind:

public ObjetsPropriete() 
{ 
    path = new String("./Images/Boule.png"); 
    dim = new Dimension(32,32); 
    type = Objet.ROND; 
} 

Vielen Dank und einen schönen Tag!

Antwort

0

Vielen Dank für Ihre Antwort, dank dieser habe ich herausgefunden, wie ich mein Problem lösen kann.

Die Ursache des Problems war die Verwendung von DrawImage am objectLocation, während drawImage auf das Objekt selbst am angegebenen Speicherort drucken.

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
     RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 

    if (picture != null) { 
    g.drawImage(picture, 0, 0, this); 
    } 
} 
3

Alle Ihre Objekte haben eine Position von (10, 10), also würde ich vermuten, dass sie übereinander liegen. Also los, diese Aussage loswerden.

jeuPanel.add(obj, obj.location); 

Der zweite Parameter bedeutet nichts für die Methode add (...). Es gibt den Speicherort der Komponente nicht an. Beseitigen Sie den zweiten Parameter.

(wenn ich den Code zu verstehen) und Sie den Speicherort angeben, dann müssen Sie etwas tun, wie:

//getListeObjets().add(new Rond(gconfig.getObjetsTab()[i])); 
Rond rond = new Rond(gconfig.getObjetsTab()[i]); 
rond.setLocation(32*i, 32*i); 
getListeObjets().add(rond); 

Der obige Code würde jeder im Panel-Objekt schräg positionieren.

Der entscheidende Punkt ist, dass Sie jede Komponente an einem eindeutigen Ort festlegen müssen.

Verwandte Themen