A
ArtjomZab
Gast
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:
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:
Code:
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, .....);
}
}
Code:
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();
}
}
Code: