# Kein Bild



## ArtjomZab (15. Mai 2008)

Das Zeichnen geht bei mir wie folgt. Basisklasse zum Zeichnen ist _GraphicSurface_. Ich hab das so
realisiert, dass jede Klasse die irgendwas zeichnen möchte _GraphicSurface_ erben muss. GraphicSurface
selbst ist ein JPanel, das heißt, dass auch ein Erbe von _GraphicSurface_ ein JPanel ist.
Die Idee dahinter ist, dass ich ein Erben von _GraphicSurface_, welcher ja ein JPanel ist, überall in der
GUI über add() einfügen kann. Mein Problem ist, dass dies nur für JFrame funktioniert. JFrame.add(_GraphicSurface_) geht also, während JPanel.add(_GraphicSurface_) zB nicht geht. Wieso ist
das so.

Eine Beispielklasse, die GraphicSurface erbt wäre zB Ellipse:

```
public class Ellipse extends GraphicSurface
{
      public Ellipse(){}

      //muss render implementieren
      // beim Instanziieren dieser Klasse wird render ausgeführt
     public void render(int w, int h, Graphics2D g2)
     {
           g2.drawEllipse(int w, int h, .....);
     }
}
```


```
package Bib3D;
/*
* GraphicSurface stellt einen minimalen Grafikkontext her.
* Sie erbt JPanel.
* Eine Klasse, welche etwas zeichnen mÃ¶chte, kann GraphicSurface
* erben. Sie muss dann auch die abstrakte Methode 'render' implementieren,
* welche das Grafikobjekt 'Graphics2D g2' zu VerfÃ¼gung stellt.
*
* GraphicSurface ist ein JPanel. Damit ist auch jeder Erbe ein
* JPanel und kann somit 'Components' leicht angefÃ¼gt werden.
*/

import java.awt.*;
import javax.swing.*;

public abstract class GraphicSurface extends JPanel
{   
    /*
     * Einige QualitÃ¤tseinstellungen...
     */
    public Object Antialiasing = RenderingHints.VALUE_ANTIALIAS_ON;
    public Object RenderingQuality = RenderingHints.VALUE_RENDER_SPEED;
    public Object TextAntialiasing = RenderingHints.VALUE_TEXT_ANTIALIAS_ON;
   
    public boolean clearSurface = true;
    private boolean clearOnce;
   
    private Toolkit toolkit;
   
    public GraphicSurface()
    {
        this.toolkit = getToolkit();
        this.setBackground(new Color(255,255,255));
    }
   
    public abstract void render(int w, int h, Graphics2D g2);
   
     /*
     * Einige QualitÃ¤tseinstellungen...
     */
    public void setAntialiasing(boolean value)
    {
       this. Antialiasing = value
            ? RenderingHints.VALUE_ANTIALIAS_ON
            : RenderingHints.VALUE_ANTIALIAS_OFF;
    }

     /*
     * Einige QualitÃ¤tseinstellungen...
     */
    public void setTextAntialiasing(boolean value)
    {
        this.TextAntialiasing = value
            ? RenderingHints.VALUE_TEXT_ANTIALIAS_ON
            : RenderingHints.VALUE_TEXT_ANTIALIAS_OFF;
    }
   
     /*
     * Einige QualitÃ¤tseinstellungen...
     */
    public void setRenderingQuality(boolean value)
    {
        this.RenderingQuality = value
            ? RenderingHints.VALUE_RENDER_QUALITY
            : RenderingHints.VALUE_RENDER_SPEED;
    }
   
     /*
     * Liefert ein Graphics2D Objekt auf Basis eines Graphics Objekts.
     */
    public Graphics2D createGraphics2D(int width, int height, Graphics g)
    {

        Graphics2D g2 = (Graphics2D) g;
       
        g2.setBackground(getBackground());
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, Antialiasing);
        g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingQuality);
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, TextAntialiasing);

        if (this.clearSurface || this.clearOnce)
        {
            g2.clearRect(0, 0, width, height);
            this.clearOnce = false;
        }

        return g2;
    }

    /*
     * ÃœberfÃ¼hrt Graphics int Graphics2D und zeichnet...
     */
    @Override
    public void paint(Graphics g)
    {
        Dimension d = getSize();
       
        Graphics2D g2 = createGraphics2D(d.width, d.height, g);
       
        this.render(d.width, d.height, g2);
       
        g2.dispose();     
    }   
}
```


```

```


----------



## SlaterB (15. Mai 2008)

das kann ganz einfache Gründe haben, etwas dass das JPanel, zu dem du dein GraphicSurface-Objekt addest nicht in der GUI angezeigt wird oder nur mit sehr wenig Platz/ anderen Layout,

poste bitte ein komplettes Programm mit JFrame und main und ohne ...
und lasse bitte (testweise) solchen Quark wie setRenderingQuality() weg,
es sei denn, das ist das Problem, z.B. wenn es ohne geht

------

verwende zum Zeichnen

public void paintComponent(Graphics g)
    { 
super.paintComponent(g);
....
}


----------



## Quaxli (15. Mai 2008)

Ich würde fast vermuten, daß es am fehlenden super-Aufruf liegt. Wenn Du die paint-Methode änderst, wie es SlaterB vorgeschlagen hat, könnte das Dein Problem schon erschlagen.


----------



## ArtjomZab (15. Mai 2008)

Also das mit _super_ geht nicht.

Aber ich versuch das Problem mal zu verallgemeinern.
Diese Klasse ist ein JPanel und zeichnet eine Ellipse auf sich selbst(es ist ja ein JPanel).

```
public class Ellipse extends GraphicSurface{
      public Ellipse(){}

      public void render(int w, int h, Graphics2D g2){
           g2.drawEllipse(w,h,g2,...);
      }
}
```

Ein objekt dieser Klasse wird dann einfach wie eine Component behandelt und sollte eigentlich
überall zu adden sein.

Wenn ich die Ellipse wie folgt adde klappt es auch.

```
public class View extends JFrame{
     public View(){
      .....
      .....
      this.add(new Ellipse());
      this.setVisible(true);
     }
}
```

Wenn ich die Ellipse aber einem JPanel adde wird gar nicht gezeichnet.
Ich hab mal etwas Debugging gemacht und festgestellt, dass paint, dass in GraphicSurface steckt,
beim Instanziieren gar nicht aufgerufen wird, wenn ich wie gesagt zu einem JPanel adde.?!?!

Ich arbeite überwiegend mit Netbeans und erzeuge mit dem integrierten GuiBuilder die Guis.
Wenn ich eine solche Gui habe, die einfach nur wie Oben ein JFrame ohne irgrendwelche JPanels ist
klappt das anfügen einer Ellipse wie oben auch nicht. Erst wenn ich die Gui per Hand mache, in diesem Falle
einen rohen JFrame, dann klappt das adden einer Ellipse.


----------

