Gezeichnetes Objekt verschwindet nachdem erneut gezeichnet wird

DonBronson

Mitglied
Hallo,

für ein aktuelles Projekt, will ich mehrere RoundRectangles zeichnen.
Ich habe bereits ein JFrame und eine Menüleiste, die super funktionieren. Wenn ich im Menü auf "Create Sphere" klicke, erscheint ein Dialog, wo man mit dem ColorChooser die Farbe auswählen kann. Dann muss man Namen, width&height und x-/y-Koordinaten angeben. Nachdem ich die Methode aufrufe, erhalte ich auch korrekterweise mein RoundedReactangle:

screen.PNG

Wenn ich ein zweites erstellen will, klappt es auch, aber das erste verschwindet nun:

screen1.PNG

Wenn ich das Fenster mir der Maus resize, dann taucht das erste wieder auf und das zweite verschwindet.

[CODE lang="java" title="JFrame:"] public void createWindow() {
/** Frame */
this.setTitle("Diagram");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(700,500);
this.setLocationRelativeTo(null);
this.setVisible(true);
}[/CODE]

[CODE lang="java" title="Die createSphere-Methode, welche durch das MenuItem aufgerufen wird:"]public void createSphere(String name, int width, int height, int x, int y, Color color) {
this.add(new Sphere(name, width, height, x, y, color));
this.validate();
}[/CODE]

[CODE lang="java" title="Meine Sphere-Klasse"]public class Sphere extends JPanel {

private String name;
private int width;
private int height;
private int xPos;
private int yPos;
private Color color;

public Sphere(String name, int width, int height, int xPos, int yPos, Color color) {
this.name = name;
this.width = width;
this.height = height;
this.xPos = xPos;
this.yPos = yPos;
this.color = color;
}

public void paintComponent (Graphics g) {
super.paintComponent(g);
g.drawRoundRect(this.xPos,this.yPos,this.width,this.height, 15, 15);
g.setColor(this.color);
g.fillRoundRect(this.xPos,this.yPos,this.width,this.height, 15, 15);
}[/CODE]

Ich will mit dem Programm mehrere Rechtecke zeichnen können. Ich bin seit gestern Nachmittag auf Fehlersuche, aber leider klappt für mich nichts.
 

Robert Zenz

Top Contributor
Ich glaube, dass die Groesze von deinen Spheres nicht gleich der Panel Groesze ist, also die Panels welche du da erzeugst fuellen wahrscheinlich das gesamte oder zumindest teilweise das Eltern-Panel. Das kannst du verifizieren in dem du in der paint-Methode *alles* mit einer Farbe befuellst, dann siehst du wie grosz deine Sphere-Panels in Wirklichkeit sind.

Besser waere es wenn die Sphere-Panels direkt die richtige Groesze und Position in Eltern-Panel haben, und dann einfach nur in sich selbst zeichnen.
 

DonBronson

Mitglied
Ich glaube, dass die Groesze von deinen Spheres nicht gleich der Panel Groesze ist, also die Panels welche du da erzeugst fuellen wahrscheinlich das gesamte oder zumindest teilweise das Eltern-Panel. Das kannst du verifizieren in dem du in der paint-Methode *alles* mit einer Farbe befuellst, dann siehst du wie grosz deine Sphere-Panels in Wirklichkeit sind.

Besser waere es wenn die Sphere-Panels direkt die richtige Groesze und Position in Eltern-Panel haben, und dann einfach nur in sich selbst zeichnen.
Habe es grade ausprobiert und wenn ich dem JPanel eine BackgroundColor gebe, dann wird das ganze JFrame eingenommen.
edit: Danke für die schnelle Antwort, vllt. hilft das schon.. :/
 

DonBronson

Mitglied
Ich glaube, dass die Groesze von deinen Spheres nicht gleich der Panel Groesze ist, also die Panels welche du da erzeugst fuellen wahrscheinlich das gesamte oder zumindest teilweise das Eltern-Panel. Das kannst du verifizieren in dem du in der paint-Methode *alles* mit einer Farbe befuellst, dann siehst du wie grosz deine Sphere-Panels in Wirklichkeit sind.

Besser waere es wenn die Sphere-Panels direkt die richtige Groesze und Position in Eltern-Panel haben, und dann einfach nur in sich selbst zeichnen.
Ich habe es mal ausprobiert und im Konstruktor der Sphere wie folgt die BackgroundColor gesetzt:
Java:
this.setBackground(Color.black);
Nun wollte ich direkt die Größe korrekt setzen mit:
Java:
this.setBounds(xPos, yPos, width, height);

Das funktioniert allerdings nicht. Wenn ich eine Sphere erstelle, nimmt das JPanel der Sphere trotzdem das ganze JFrame ein.
 

DonBronson

Mitglied
So habe nun nochmal rumprobiert. Also es wird immer noch erst nach resize mit der Maus sichtbar (warum auch immer?)
Aber ich habe der setBounds()-Methode nicht wie vorher einfach die height und width übergeben, sondern manuell eingegeben.
[CODE lang="java" highlight="9"]public Sphere(String name, int width, int height, int xPos, int yPos, Color color) {
this.name = name;
this.width = width;
this.height = height;
this.xPos = xPos;
this.yPos = yPos;
this.color = color;
this.setBackground(Color.black);
this.setBounds(xPos,yPos,200,200);
}[/CODE]

Nun wird es komplett dargestellt, aber natürlich immer noch zu groß:

screen5.PNG

Ich verstehe allerdings nicht, warum sich die Größen unterscheiden. Warum ist die width&height, die ich übergeben habe kleiner als beim Zeichnen des Rechtecks. Ich mein 100x100 müsste doch gleich sein, egal, ob JPanel oder Rectangle?!
 

DonBronson

Mitglied
Okay, das habe ich nun auch gelöst. Das JPanel bekommt xPos, yPos und width&height übergeben. Die Position des Rectangles hängt nun aber vom JPanel ab und nicht vom JFrame, weswegen ich hier nun statt xPos und yPos einfach zweimal 0 übergebe, damit das Rectangle "oben-links" vom JPanel gezeichnet wird.

[CODE lang="java" highlight="17, 22, 24"]public class Sphere extends JPanel {

private String name;
private int width;
private int height;
private int xPos;
private int yPos;
private Color color;

public Sphere(String name, int width, int height, int xPos, int yPos, Color color) {
this.name = name;
this.width = width;
this.height = height;
this.xPos = xPos;
this.yPos = yPos;
this.color = color;
this.setBounds(xPos,yPos,width,height);
}

public void paintComponent (Graphics g) {
super.paintComponent(g);
g.drawRoundRect(0,0,this.width,this.height, 15, 15);
g.setColor(this.color);
g.fillRoundRect(0,0,this.width,this.height, 15, 15);
}
}[/CODE]

Ich kann jetzt sogar mehrere Spheres zeichnen:

screen6.PNG

Allerdings besteht immer noch das Problem, dass alles, was gezeichnet wird, erst angezeigt wird, sobald ich das Fenster mit der Maus resize.


Edit: Das Problem mit dem resize wurde durch die Methode repaint() behoben:

[CODE lang="java" highlight="4"] public void createSphere(String name, int width, int height, int x, int y, Color color) {
this.add(new Sphere(name, width, height, x, y, color));
validate();
repaint();
}[/CODE]
 
Zuletzt bearbeitet:

Blender3D

Top Contributor
Das JPanel bekommt xPos, yPos und width&height übergeben.
Du könntest statt eines JPanels für die Grafiken eigene Klassen machen und dies in einem JPanel zeichnen lassen.
[CODE lang="java" title="StartGraphicUtil" highlight="7"]import javax.swing.JFrame;

public class StartGraphicUtil {
public static void main(String[] args) {
JFrame frame = new JFrame("Grafik Objekte ");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new GraphicObjectPanel(500, 500));
frame.setResizable(false);
frame.pack();
frame.setVisible(true);
}
}[/CODE]


[CODE lang="java" title="GraphicObjectPanel" highlight="25-30,9"]import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Vector;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class GraphicObjectPanel extends JPanel {
private Vector<Object2D> shapes = new Vector<Object2D>();

public GraphicObjectPanel(int width, int height) {
setPreferredSize(new Dimension(width, height));
Oval oval = new Oval("Das ist rund!", 100, 100);
oval.setPosition(100, 50);
oval.setBackColor(Color.CYAN);
RoundRect rect = new RoundRect("Das ist beinahe eckig", 80, 100);
rect.setBackColor(Color.RED);
rect.setPosition(300, 150);
shapes.add(oval);
shapes.add(rect);
setBackground(Color.DARK_GRAY);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Object2D s : shapes) {
s.draw(g);
}
}
}[/CODE]
[CODE lang="java" title="RoundRect"]import java.awt.Graphics;

public class RoundRect extends Object2D {

public RoundRect(String name, int width, int height) {
super(name, width, height);
}

@Override
protected void drawObject(Graphics g) {
g.setColor(backColor);
g.fillRoundRect(x, y, width, height, width / 5, width / 5);
}
}[/CODE]
[CODE lang="java" title="Oval"]import java.awt.Graphics;

public class Oval extends Object2D {
public Oval(String name, int width, int height) {
super(name, width, height);
}

@Override
protected void drawObject(Graphics g) {
g.setColor(backColor);
g.fillOval(x, y, width, height);
}
}[/CODE]



[CODE lang="java" title="Object2D"]import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;

public abstract class Object2D {
protected String name;
protected int x;
protected int y;
protected int width;
protected int height;
protected Color backColor = Color.WHITE;
protected Color frameColor = Color.LIGHT_GRAY;
private boolean visible = true;

public Object2D(String name, int width, int height) {
this.name = name;
this.width = width;
this.height = height;
}

public final void draw(Graphics g) {
if (!visible)
return;
drawObject(g);
};

protected abstract void drawObject(Graphics g);

public boolean isVisible() {
return visible;
}

public Rectangle getBoundingBox() {
return new Rectangle(x, y, width, height);
}

public Point getCenter() {
return new Point(x + width / 2, y + height / 2);
}

public void setBackColor(Color backColor) {
this.backColor = backColor;
}

public void setFrameColor(Color frameColor) {
this.frameColor = frameColor;
}

public void setPosition(int x, int y) {
this.x = x;
this.y = y;
}

public void setVisible(boolean ok) {
this.visible = ok;
}

@Override
public String toString() {
return "[" + name + "| " + x + "," + y + "]";
}
}[/CODE]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J gezeichnetes Objekt anklicken AWT, Swing, JavaFX & SWT 10
M Gezeichnetes Dreieck mit HoughLines erkennen AWT, Swing, JavaFX & SWT 9
F Gezeichnetes als bild speichern AWT, Swing, JavaFX & SWT 4
T HILFE wie lösche ich gezeichnetes per tastendruck AWT, Swing, JavaFX & SWT 1
S Swing JMenu löscht auf panel gezeichnetes AWT, Swing, JavaFX & SWT 3
T 2D-Grafik gezeichnetes Bild verschieben - rand bleibt sichtbar AWT, Swing, JavaFX & SWT 2
L Gezeichnetes Image mit DrawImage überzeichnen AWT, Swing, JavaFX & SWT 3
_user_q Objekt.setSelected(false), wenn es nicht mehr fokussiert wird AWT, Swing, JavaFX & SWT 2
B mit maus Objekt bewegen AWT, Swing, JavaFX & SWT 3
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
U Was genau ist ein Shape-Objekt? AWT, Swing, JavaFX & SWT 3
DonBronson Objekt bewegen (Mausposition) AWT, Swing, JavaFX & SWT 3
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
U Was ist ein Shape, also klar ein Objekt, aber was ist damit gemeint (Graphics2d)? Und was sidn affinetransformationen AWT, Swing, JavaFX & SWT 1
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
C Objekt an paintComponent weitergeben AWT, Swing, JavaFX & SWT 1
M Swing Objekt Array in GUI ausgeben AWT, Swing, JavaFX & SWT 1
A Objekt von einem Window erstellen? AWT, Swing, JavaFX & SWT 8
F Java FX Von der Fxml Datei zum Objekt AWT, Swing, JavaFX & SWT 8
M Swing Durch Usereingabe neues Objekt AWT, Swing, JavaFX & SWT 2
K Color-Objekt erzeugen in CMYK AWT, Swing, JavaFX & SWT 2
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
A Swing Null Pointer Exception obwohl Objekt initialisiert AWT, Swing, JavaFX & SWT 21
thet1983 JavaFX TableView Objekt Daten anzeige AWT, Swing, JavaFX & SWT 2
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
L JavaFX als eigenes Objekt AWT, Swing, JavaFX & SWT 3
M [JavaFX] Objekt um Zentrum rotieren (Camera) AWT, Swing, JavaFX & SWT 1
E JavaFx Screne mehr als ein "Objekt" zuordnen ? AWT, Swing, JavaFX & SWT 2
F 2D-Grafik Objekt durch Einwirkung einer Kraft im Raum bewegen AWT, Swing, JavaFX & SWT 14
J Bilder als Variable an einem Objekt speichern AWT, Swing, JavaFX & SWT 3
B Event Handling MouseListener Behält seine Variablen, auch wenn ich ein neus Objekt erstelle AWT, Swing, JavaFX & SWT 2
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
P Event Handling Anfängerfrage: ActionEvent bekommt kein Zugriff auf Objekt AWT, Swing, JavaFX & SWT 3
R Array aus einem Objekt auslesen AWT, Swing, JavaFX & SWT 4
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
A AWT TTF-Datei zu Font-Objekt finden? AWT, Swing, JavaFX & SWT 5
S Objekt durch Tasteneingabe mehrmals drehen AWT, Swing, JavaFX & SWT 9
E Swing Objekt zu Position (Point) bewegen AWT, Swing, JavaFX & SWT 2
T 3D-Grafik (Java3D) Aus einem Objekt einer Szene (Würfel, Ebene) die wichtigen Randkoordinaten auslesen AWT, Swing, JavaFX & SWT 3
K Action Listener implementieren über Objekt AWT, Swing, JavaFX & SWT 14
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
V Persistentes Objekt laden Progressbar AWT, Swing, JavaFX & SWT 7
F Canvas Objekt außerhalb des Frames zeichnen AWT, Swing, JavaFX & SWT 3
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
propra Schnittpunkt zwischen Objekt und Kante finden AWT, Swing, JavaFX & SWT 24
L Graphics Objekt - aus anderer Klasse aufrufen / übergeben AWT, Swing, JavaFX & SWT 5
S Objekt einmal laden zweimal anzeigen 3d AWT, Swing, JavaFX & SWT 6
I Swing Zugriff auf ein Objekt AWT, Swing, JavaFX & SWT 2
F Nur ein Objekt auf Canvas neu zeichnen AWT, Swing, JavaFX & SWT 4
R Möglichkeiten ein abgeleitetes Objekt zu erzeugen AWT, Swing, JavaFX & SWT 4
P Swing Wie bekomme ich eine Referenz auf ein Objekt das im EDT erzeugt wird? Und anderes... AWT, Swing, JavaFX & SWT 8
T Objekt in Kreisbahn bewegen AWT, Swing, JavaFX & SWT 5
B Zeichnen von Bildern auf JPanel aus eigenem Objekt AWT, Swing, JavaFX & SWT 19
V Parameter an Runnable-Objekt übergeben AWT, Swing, JavaFX & SWT 6
Dit_ Objekt mit ActionEvent übergeben AWT, Swing, JavaFX & SWT 2
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
L Swing Auf unabhängiges Image-Objekt zeichnen AWT, Swing, JavaFX & SWT 8
A SWT SWT - Unbekannte Fläche (Objekt) erscheint im Composite AWT, Swing, JavaFX & SWT 6
D Objekt mit Button erstellen und mit anderem Button verwenden AWT, Swing, JavaFX & SWT 4
P Objekt kopieren AWT, Swing, JavaFX & SWT 2
M Graphics-Objekt aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
U [MVC] Objekt bearbeiten AWT, Swing, JavaFX & SWT 9
O Swing JTable Colum Objekt AWT, Swing, JavaFX & SWT 6
Dit_ Ein Kreis als Graphics2D oder als Ellipse2D Objekt AWT, Swing, JavaFX & SWT 19
M Objekt im ActionListener ansprechen AWT, Swing, JavaFX & SWT 3
C Wie komme ich an ein Objekt aus einem JTree? AWT, Swing, JavaFX & SWT 10
R FlowLayout: 1 Objekt pro Zeile AWT, Swing, JavaFX & SWT 5
D Objekt (Map) in Textfeld ausgeben AWT, Swing, JavaFX & SWT 10
kirchrath Swing Aus ActionEvent Objekt herausfinden auf dem er ausgeführt wurde AWT, Swing, JavaFX & SWT 4
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
S Objekt wird während Endlosschleife nur einmal bewegt AWT, Swing, JavaFX & SWT 2
W Objekt-array als Raster visualisieren AWT, Swing, JavaFX & SWT 3
F Herausfinden, auf welchem Objekt der Fokus liegt AWT, Swing, JavaFX & SWT 2
G Tooltip Text für ein Shape Objekt AWT, Swing, JavaFX & SWT 2
D DnD ganzer Objekte(Objekt erstellen) AWT, Swing, JavaFX & SWT 2
G Wie ziehe ich ein Objekt aus einer JList? AWT, Swing, JavaFX & SWT 7
O JTable mit objekt-daten füllen AWT, Swing, JavaFX & SWT 4
B in jList feld aus einem objekt anzeigen AWT, Swing, JavaFX & SWT 2
R SWT color Objekt AWT, Swing, JavaFX & SWT 4
K Graphics-Objekt zeichnet nicht alle Bilder AWT, Swing, JavaFX & SWT 3
N Graphics Objekt "puffern" AWT, Swing, JavaFX & SWT 7
L Objekt in JComboBox einfügen AWT, Swing, JavaFX & SWT 2
S JComboBox, ein Renderer und das selektierte Objekt AWT, Swing, JavaFX & SWT 4
R Graphics Objekt ändern AWT, Swing, JavaFX & SWT 11
B actionPerformed reagiert nicht auf das Canvas-objekt AWT, Swing, JavaFX & SWT 11
J DocumentListener uebergibt Objekt; wie in JTextfield casten? AWT, Swing, JavaFX & SWT 3
B Objekt in "actionPerformed" erzeugen und nutzen AWT, Swing, JavaFX & SWT 3
P JSpinner Objekt anstatt Zahlen sollen man Namen auswählen AWT, Swing, JavaFX & SWT 2
B Ein Image Objekt drehen? AWT, Swing, JavaFX & SWT 2
G Referenz über MenuItem aus ActionListener auf das Objekt AWT, Swing, JavaFX & SWT 8
lin Welches Objekt für einen About-Dialog verwenden? AWT, Swing, JavaFX & SWT 2
R Selectable Graphics Objekt gesucht. AWT, Swing, JavaFX & SWT 5
Wildcard FontMetrics ohne Graphics-Objekt AWT, Swing, JavaFX & SWT 13
S objekt kann methode der aufrufenden klasse nicht aufrufen AWT, Swing, JavaFX & SWT 2
Y Objekt in JFrame AWT, Swing, JavaFX & SWT 3
M Objekt in TableCellRenderer packen, warum ein Fehler? AWT, Swing, JavaFX & SWT 2
K Objekt in eine bestimmte Zelle eines JTables legen AWT, Swing, JavaFX & SWT 3
D getResource() bei Image-Objekt AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben