repaint für Aufruf von paintComponent-Klasse ungeeignet?

Status
Nicht offen für weitere Antworten.

JFeel-x

Mitglied
Hallo, vor Urzeiten hab ich mir mal einen Horrorcode geschrieben, der mir im Nachhinein sogar vernünftig vorkommt.
trotzdem irgendwie abschreckend. Wenn ihr einen beseren weg wisst, bitte sagsts mir

Ich wollte mir eine Basisklasse Painter schreiben, bei der ich einfach nur n paar set-Methoden aufrufen muss und dann schon alles über paintComponent läuft...

[highlight="Java"]
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Polygon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.ImageObserver;

import javax.swing.JComponent;
import javax.swing.JFrame;
public class Painter extends JComponent {

public final static int DRAW_IMAGE = 0;

public final static int DRAW_LINE = 99;

public final static int DRAW_ARC = 1, FILL_ARC = -1,
DRAW_OVAL = 2, FILL_OVAL = -2,
DRAW_RECT = 3, FILL_RECT = -3,
DRAW_POLYGON = 4, FILL_POLYGON = -4,
DRAW_ROUND_RECT = 5, FILL_ROUND_RECT = -5;

public static final int DRAW_POLYLINE = -100;

public static final int CLEAR_RECT = 123;

public static final int COPY_AREA = -123;



private int x;
private int y;
private int width;
private int height;
private int dx;
private int dy;
private int startAngle;
private int arcAngle;
private int dx2;
private int dy2;
private int sx1;
private int sy1;
private int sx2;
private int sy2;
private int x2;
private int y2;
private int nPoints;
private int arcWidth;
private int arcHeight;

private int[] xPoints;
private int[] yPoints;

private Image img;
private ImageObserver observer;
private Polygon p;

private Font font;
private Color color = Color.BLACK;

private int modus;

public Painter(int modus){
this.modus = modus;
}

public void setFont(Font font)
{
this.font = font;
}
public Font getFont()
{
return this.font;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);

g.setFont(font);
g.setColor(color);

switch ( modus )
{
case CLEAR_RECT:{

g.clearRect(x, y, width, height);

break;
}
case COPY_AREA:{

g.copyArea(x, y, width, height, dx, dy);

break;
}
case DRAW_ARC:{

g.drawArc(x, y, width, height, startAngle, arcAngle);

break;
}
case DRAW_IMAGE:{

g.drawImage(img, dx, dy, dx2, dy2, sx1, sy1, sx2, sy2, observer);

break;
}
case DRAW_LINE:{

g.drawLine(x, y, x2, y2);

break;
}
case DRAW_OVAL:{

g.drawOval(dx, y, width, height);

break;
}
case DRAW_POLYGON:{

g.drawPolygon(p);

break;
}
case DRAW_POLYLINE:{

g.drawPolyline(xPoints, yPoints, nPoints);

break;
}
case DRAW_RECT:{

g.drawRect(x, y, width, height);

break;
}
case DRAW_ROUND_RECT:{

g.drawRoundRect(x, y, width, height, arcWidth, arcHeight);

break;
}
case FILL_ARC:{

g.fillArc(x, y, width, height, startAngle, arcAngle);

break;
}
case FILL_OVAL:{

g.fillOval(x, y, width, height);

break;
}
case FILL_POLYGON:{

g.fillPolygon(p);

break;
}
case FILL_RECT:{

g.fillRect(x, y, width, height);

break;
}
case FILL_ROUND_RECT:{

g.fillRoundRect(x, y, width, height, arcWidth, arcHeight);

break;
}
}
}
//*****************************************************
public static void main(String[]args)
{
final Painter p = new Painter(Painter.DRAW_LINE);


JFrame f= new JFrame();
f.setSize(300,300);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.add(p);

p.setColor(Color.GREEN);
p.setX(50);
p.setY(50);
p.setX2(200);
p.setY2(200);
p.addMouseListener(new MouseAdapter(){

@Override
public void mouseClicked(MouseEvent e) {
p.repaint();
}

});

}
//*****************************************************
public void setY(int y) {
this.y = y;
}
public int getY(){
return this.y;
}

public void setColor(Color color) {
this.color = color;
}
public Color getColor() {
return color;
}

public void setX(int x) {
this.x = x;
}


public int getX() {
return x;
}
public void setModus(int modus) {
this.modus = modus;
}
public int getModus() {
return modus;
}
public void setWidth(int width) {
this.width = width;
}
public int getWidth() {
return width;
}
public void setHeight(int height) {
this.height = height;
}
public int getHeight() {
return this.height;
}
public void setDx(int dx) {
this.dx = dx;
}
public int getDx() {
return this.dx;
}
public void setDy(int dy) {
this.dy = dy;
}
public int getDy() {
return this.dy;
}
public void setStartAngle(int startAngle) {
this.startAngle = startAngle;
}
public int getStartAngle() {
return this.startAngle;
}
public void setArcAngle(int arcAngle) {
this.arcAngle = arcAngle;
}
public int getArcAngle() {
return this.arcAngle;
}
public void setDx2(int dx2) {
this.dx2 = dx2;
}
public int getDx2() {
return this.dx2;
}
public void setDy2(int dy2) {
this.dy2 = dy2;
}
public int getDy2() {
return this.dy2;
}
public void setSx1(int sx1) {
this.sx1 = sx1;
}
public int getSx1() {
return this.sx1;
}
public void setSy1(int sy1) {
this.sy1 = sy1;
}
public int getSy1() {
return this.sy1;
}
public void setSx2(int sx2) {
this.sx2 = sx2;
}
public int getSx2() {
return this.sx2;
}
public void setSy2(int sy2) {
this.sy2 = sy2;
}
public int getSy2() {
return sy2;
}
public void setX2(int x2) {
this.x2 = x2;
}
public int getX2() {
return this.x2;
}
public void setY2(int y2) {
this.y2 = y2;
}
public int getY2() {
return this.y2;
}
}
[/highlight]
Oder liegt es am layout-manager/Wurde das Panel nicht richtig geaddet?

Danke im Voraus
 
S

SlaterB

Gast
setVisible(true); erst als letztes aufrufen nach dem Einfügen aller Elemente,
bei setVisible(true); wird das Layout berechnet
 

Marco13

Top Contributor
Sonderlich hübsch ist das nicht. Abgesehen von solchen Seiteneffekten, wie dass du
public int getWidth()
aus Component überschrieben hast, und das jetzt alles mögliche zurückgibt, aber sicher nicht die Breite der Component.

(Falls du Eclipse verwendest, gibt's im Codefenster ganz links so eine Leiste mit kleinen "Pfeilchen" - da kann man draufklicken, um zu sehen, welche Methode man überschrieben hat...)
 

JFeel-x

Mitglied
Danke, es hat am Überschreiben gelegen!

vielen Dank, jetzt kann ich das Zeug so lassen wie es ist und es benutzen ^^

Falls es jemanden Interessiert:
[highlight="Java"]
package GUI;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Polygon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.ImageObserver;

import javax.swing.JComponent;
import javax.swing.JFrame;
public class Painter extends JComponent {

public final static int DRAW_IMAGE = 0;

public final static int DRAW_LINE = 99;

public final static int DRAW_ARC = 1, FILL_ARC = -1,
DRAW_OVAL = 2, FILL_OVAL = -2,
DRAW_RECT = 3, FILL_RECT = -3,
DRAW_POLYGON = 4, FILL_POLYGON = -4,
DRAW_ROUND_RECT = 5, FILL_ROUND_RECT = -5;

public static final int DRAW_POLYLINE = -100;

public static final int CLEAR_RECT = 123;

public static final int COPY_AREA = -123;



private int x;
private int y;
private int width;
private int height;
private int dx;
private int dy;
private int startAngle;
private int arcAngle;
private int dx2;
private int dy2;
private int sx1;
private int sy1;
private int sx2;
private int sy2;
private int x2;
private int y2;
private int nPoints;
private int arcWidth;
private int arcHeight;

private int[] xPoints;
private int[] yPoints;

private Image img;
private ImageObserver observer;
private Polygon p;

private Font font;
private Color color = Color.BLACK;

private int modus;

public Painter(int modus){
this.modus = modus;
}

public void setPainterFont(Font font)
{
this.font = font;
}
public Font getPainterFont()
{
return this.font;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);

g.setFont(font);
g.setColor(color);

switch ( modus )
{
case CLEAR_RECT:{

g.clearRect(x, y, width, height);

break;
}
case COPY_AREA:{

g.copyArea(x, y, width, height, dx, dy);

break;
}
case DRAW_ARC:{

g.drawArc(x, y, width, height, startAngle, arcAngle);

break;
}
case DRAW_IMAGE:{

g.drawImage(img, dx, dy, dx2, dy2, sx1, sy1, sx2, sy2, observer);

break;
}
case DRAW_LINE:{

g.drawLine(x, y, x2, y2);

break;
}
case DRAW_OVAL:{

g.drawOval(dx, y, width, height);

break;
}
case DRAW_POLYGON:{

g.drawPolygon(p);

break;
}
case DRAW_POLYLINE:{

g.drawPolyline(xPoints, yPoints, nPoints);

break;
}
case DRAW_RECT:{

g.drawRect(x, y, width, height);

break;
}
case DRAW_ROUND_RECT:{

g.drawRoundRect(x, y, width, height, arcWidth, arcHeight);

break;
}
case FILL_ARC:{

g.fillArc(x, y, width, height, startAngle, arcAngle);

break;
}
case FILL_OVAL:{

g.fillOval(x, y, width, height);

break;
}
case FILL_POLYGON:{

g.fillPolygon(p);

break;
}
case FILL_RECT:{

g.fillRect(x, y, width, height);

break;
}
case FILL_ROUND_RECT:{

g.fillRoundRect(x, y, width, height, arcWidth, arcHeight);

break;
}
}
}
//*****************************************************
public static void main(String[]args)
{
final Painter p = new Painter(Painter.DRAW_LINE);


JFrame f= new JFrame();
f.setSize(600,450);

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.add(p);

p.setColor(Color.RED);
p.setX(50);
p.setY(50);
p.setX2(200);
p.setY2(200);
f.setVisible(true);

}
//*****************************************************
public void setY(int y) {
this.y = y;
}
public int getPainterY(){
return this.y;
}

public void setColor(Color color) {
this.color = color;
}
public Color getColor() {
return color;
}

public void setX(int x) {
this.x = x;
}


public int getPainterX() {
return x;
}
public void setModus(int modus) {
this.modus = modus;
}
public int getModus() {
return modus;
}
public void setWidth(int width) {
this.width = width;
}
public int getPainterWidth() {
return width;
}
public void setHeight(int height) {
this.height = height;
}
public int getPainterHeight() {
return this.height;
}
public void setDx(int dx) {
this.dx = dx;
}
public int getDx() {
return this.dx;
}
public void setDy(int dy) {
this.dy = dy;
}
public int getDy() {
return this.dy;
}
public void setStartAngle(int startAngle) {
this.startAngle = startAngle;
}
public int getStartAngle() {
return this.startAngle;
}
public void setArcAngle(int arcAngle) {
this.arcAngle = arcAngle;
}
public int getArcAngle() {
return this.arcAngle;
}
public void setDx2(int dx2) {
this.dx2 = dx2;
}
public int getDx2() {
return this.dx2;
}
public void setDy2(int dy2) {
this.dy2 = dy2;
}
public int getDy2() {
return this.dy2;
}
public void setSx1(int sx1) {
this.sx1 = sx1;
}
public int getSx1() {
return this.sx1;
}
public void setSy1(int sy1) {
this.sy1 = sy1;
}
public int getSy1() {
return this.sy1;
}
public void setSx2(int sx2) {
this.sx2 = sx2;
}
public int getSx2() {
return this.sx2;
}
public void setSy2(int sy2) {
this.sy2 = sy2;
}
public int getSy2() {
return sy2;
}
public void setX2(int x2) {
this.x2 = x2;
}
public int getX2() {
return this.x2;
}
public void setY2(int y2) {
this.y2 = y2;
}
public int getY2() {
return this.y2;
}
}
[/highlight]
 

0x7F800000

Top Contributor
Würde es euch was ausmachen wenn ich hier ganz schüchtern nachfrage, was das alles eigentlich sein soll? :eek: Was ist der Zweck von dieser Klasse?
 

hdi

Top Contributor
Er möchte das "g" in seinem Code gerne gegen ein "painter" austauschen :bahnhof:
 

hdi

Top Contributor
So ähnlich. Soweit ich das sehe ist seine Painter-Klasse nämlich nur eine abgespeckte
Version der Graphics-Klasse.

Toll, er kann Farben und Figuren etc per Setter einstellen, aber ob du jezt schreibst

painter.setColor()
oder
g.setColor()

ist ja wohl egal.
...oder ich versteh die Klasse auch nicht ;)
 

Ebenius

Top Contributor
So ähnlich. Soweit ich das sehe ist seine Painter-Klasse nämlich nur eine abgespeckte Version der Graphics-Klasse.
Nö. Dieser Painter ist doch eine Komponente und hält damit die zu zeichnenden Objekte und zeichnet sie immer wieder. Graphics macht genau das eben nicht.

Ebenius
 

hdi

Top Contributor
Naja dann ist es eben das gleiche wie zB ein JPanel.
Also... wirklich ich verstehe den Sinn auch nicht. Wo soll das einem weiterhelfen
oder irgendwas angenehmer gestalten?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C repaint() für JLabel AWT, Swing, JavaFX & SWT 2
C Permanenter Inhalt für JPanel (repaint vermeiden) AWT, Swing, JavaFX & SWT 2
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
O Girdbag Formatierung nach repaint verloren AWT, Swing, JavaFX & SWT 2
E Swing - repaint() AWT, Swing, JavaFX & SWT 6
T Image wird nicht angezeigt?! - MediaTracker/repaint AWT, Swing, JavaFX & SWT 9
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
A Swing Infinite repaint loop unterbrechen AWT, Swing, JavaFX & SWT 7
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
F "Verrutschen" von Komponenten bei repaint() AWT, Swing, JavaFX & SWT 9
Junker Fensterinhalt vor ausführen von repaint komplett löschen. AWT, Swing, JavaFX & SWT 2
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben