# Hilfe in paint() ; zeichnen



## Guest (17. Feb 2007)

Hallo Leute,
Ich steck jetzt seit längerer Zeit in folgendem Problem fest:
Ich würde gerne eine Klasse schreiben, mitder ich auf einem JFrame zeichnen kann.
Schön und gut soweit hab ich das geschafft. Jetzt will ich aber nicht nur eine Sache zeichnen sondern die Klasse nutzen um alles darstellen zu können was ich benötige, wären ungefähr 10 einzelne " paint()" Funktionen die ich aufrufen müsste.
wie mach ich das, dass ich zusätzliche Funktionen in der Klasse anlegen kann die ebenfalls auf das JFrame zeichnen können? (Geht das auch von anderen Klassen aus)
(Ich bin noch totaler Anfänger also bitte ausführlich erklären und es wär nett wenn ihr mir ein Beispiel für eine weitere "paint()" Funktion zu dem Quelltext dazu schreiben könntet und mir auch erklärt wie ich die dann vom Hauptprogramm aufruf.
Danke schonmal
Viele Grüße
Florian


```
package schiffeversenken;

import javax.swing.*;
import java.awt.Graphics;
import java.awt.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;


public class zeichneWelt extends JPanel {

    private JFrame Jframe;
    Graphics g;
    Toolkit kit = Toolkit.getDefaultToolkit();
    String title = "master.jpg";
    Image hintergrundbild = kit.getImage(title);
    BufferedImage bild; 

     
               
    protected void paintComponent(Graphics g)
   {
     super.paintComponent(g);
     System.out.println("paintComponent1");
     g.drawImage(bild,0,20,this);
     System.out.println("x: "+bild.getWidth(this));

   } 
    public zeichneWelt(){
        System.out.println("Konstruktor");
        try{
          bild = ImageIO.read(new File(title));
        }catch(IOException ioe){
          ioe.printStackTrace();
        }
    }
    
    public static void main() {
             
             //String []args
             JFrame f = new JFrame();
             f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
             f.setSize(500, 700);
             f.setContentPane(new zeichneWelt() );
             f.setVisible(true);
    }
    
    
}
```


----------



## Wildcard (17. Feb 2007)

Für mich ist deine Frage unverständlich.
Du willst eine paintComponent in mehrere Aufteilen?
Dann erstell die Methoden und ruf sie von paintComponent aus auf  ???:L


----------



## Gast (17. Feb 2007)

mein Problem ist das ich Schiffeversenken Programmieren will nun will ich ein Schiff auf den Hintergrund zeichnen. Das will ich ja aber zu einem anderen Zeitpunkt ins gleiche Fenster zeichnen.  Ich würde dann einfach gerne eine Methode vom Hauptprogramm aufrufen und nur noch die Koordinaten mitgeben. Es wär ja recht umständlich der paintComponent Informationen mitzugeben was sie jetzt zeichnen soll das ganze dann mit If-anweißungen zu verbinden und dann die ensprechenden Methoden aufrufen. Oder geht das garnicht anders?


----------



## Wildcard (17. Feb 2007)

Du zeichnest in AWT/Swing passiv, das heißt du musst alle Informationen die zum Zeichnen benötigt werden in einem Datenmodell bereithalten und darauf warten das paintComponent aufgerufen wird.
Für Schiffeversenken bietet es sich übrigens an eigene Objekte für die Schiffe zu machen die sich selbst zeichnen können.


----------



## Gast (17. Feb 2007)

kannst du mir vll kurz ein beispiel für so ein Objekt geben ? wär echt super ich kann mir gerade nicht so genaueres darunter vorstellen


----------



## Wildcard (17. Feb 2007)

```
public class MySmallShip extends Ship //Ship kann zum Beispiel JComponent erweitern
{
     public void draw(Graphics g)
     {
          g.drawSomething
     }
}
```


----------



## Gast (17. Feb 2007)

da braucht man ja zuvor des Graphics wie bekomm ich das von der Klasse?


----------



## Wildcard (17. Feb 2007)

Du rufst die Methode von einer paintComponent aus auf.


----------



## Gast (17. Feb 2007)

achso jetzt danke danke aber dann geht des ohne paintComponent nicht?


----------



## Gast (17. Feb 2007)

oder wie ist des dann muss ich alles in einer paintComponent erstellen oder kann ich mehrere benutzen?


----------



## Wildcard (17. Feb 2007)

Gast hat gesagt.:
			
		

> oder wie ist des dann muss ich alles in einer paintComponent erstellen oder kann ich mehrere benutzen?


 :?:


----------



## Guest (17. Feb 2007)

ja ich check des gerade nicht so.
mein Ziel ist es im Hauptprogramm zu schreiben:
setzeSchiff( x, y);

Wenn ich das aber über eine paintComponent machen muss geht das doch nicht oder?
also wie funktioniert es dass ich eine Klasse hab inder ich das Schiff zeichnen kann?
kannst du mir bitte kurz en Quellcode schreiben ich blick des gerade nicht?


----------



## Leroy42 (17. Feb 2007)

Wie wildcard beschrieben hat.

Die saubere Lösung ist, daß sich die Schiffe selbst auf
einem Graphics-Object zeichnen, das sie mitgeteilt bekommen:


```
public class MySmallShip extends Ship //Ship kann zum Beispiel JComponent erweitern { 
     public void draw(Graphics g, int xLinksOben, int yLinksOben)  { 
          g.drawSomething 
     } 
}
```
und in deiner Klasse die das gesamte Schiffe-Versenken-Brett repräsentiert.


```
public void paintComponent(Graphics g) {
  super.paintComponent(g);
  for (MySmallShip ship : allExistingShips)
    ship.draw(g, /*entsprechende x und y Koordinaten*/);
}
```


----------



## Leroy42 (17. Feb 2007)

Anonymous hat gesagt.:
			
		

> ja ich check des gerade nicht so.
> mein Ziel ist es im Hauptprogramm zu schreiben:
> 
> ```
> ...



Das geht natürlich auch (und ist bielleicht besser).

In diesem Fall verwaltet jedes Schiff selbst seine Koordinaten
an die es gezeichnet werden soll.


----------



## Marco13 (18. Feb 2007)

Mal ein bißchen mehr Pseudocode

```
abstract class Schiff // Erbt NICHT von JComponent!!!
{
    int x,y ... // Position, Farbe, "versenkt"-Flag.... was man halt für ein Schiff so braucht...

    public abstract void paintSchiff(Graphics g); // Jedes Schiff kan gemalt werden
}

class KleinesSchiff extends Schiff
{
    public void paintSchiff(Graphics g) // Hier steht nurnoch drin, wie ein KleinesSchiff gemalt wird
    { 
        g.setColor(...);
        g.drawRect(...);
    }
}

class Spielfeld extends JPanel
{
    private ArrayList<Schiff> schiffe = new ArrayList<Schiff>(); // Hier liegen alle Schiffe drin

    public void paintComponent(Graphcis g)
    {
        super.paintComponent(g);
        for (Schiff s : schiffe)
        {
             s.paintSchiff(g); // Male alle Schiffe (die wissen selbst, wie sie aussehen müssen)
        }
    }

    public void setzeSchiff(int x, int y) // Deine geforderte setzeSchiff-Methode
    {
        Schiff schiff = new IrgendeinSchiff(x,y);
        schiffe.add(schiff);
        reapint();
    }
}
```

Die setzeSchiff-Methode kann auch nochmal im Hauptprogramm angeboten werden, und den Aufruf dann einfach ans Spielfeld weiterreichen.


----------



## Gast (20. Feb 2007)

danke vielmals ihr habt mir sehr geholfen


----------

