blueJ Geschrieben 2. Juni 2008 Geschrieben 2. Juni 2008 Hallo zusammen! Dies ist meine erster Beitrag in diesem Forum. Daher erst mal "Hallo" an alle. So nun zu meinem Problem: Ich habe eine Klasse geschrieben, die ich von JPanel ableite. In dieser Klasse überschreibe ich die Methode paintComponent(Graphics g);. Wenn ich etwas in der Methode zeichne wird auch alles angezeigt. Ich habe einen Button mit dem ich einige Linien in das JPanel zeichne, dass klappt auch alles soweit. Wenn ich aber z.B. das Fenster meiner Applikation minimiere und wieder aufrufe sind die Striche, die ich zur Laufzeit gezeichnet habe, wieder weg. Ich habe herausgefunden, dass bei jedem Neuaufruf des Fensters wieder die paintComponent-Methode aufgerufen wird, womit meine gezeichneten Striche natürlich wieder überzeichnet werden. Meine Frage: Gibt es eine Möglichkeit, meine gezeichneten Linien auszulesen und wieder zu zeichnen, wenn das Fenster neu aufgerufen wird. Habe es schon mit g2 = (Graphics2D)getGraphics(); probiert. Es wird mir jedoch nur ein leeres Panel gezeichnet. Mein paint-Methode: public void paintComponent (Graphics g) { Dimension dim = getSize(); if(!start) { oPoint.x = dim.width/2; oPoint.y = dim.height - 30; } super.paintComponent(g); g2 = (Graphics2D) g; g2.setPaint(Color.white); g2.fill3DRect(10, 10, dim.width - 20, dim.height - 20, true); g2.setColor(Color.black); g2.setStroke(new BasicStroke(6.0F)); Line2D.Double linie1 = new Line2D.Double(oPoint.x-50, oPoint.y-20, oPoint.x+50, oPoint.y-20); Line2D.Double linie2 = new Line2D.Double(oPoint.x-50, oPoint.y-20, oPoint.x-50, oPoint.y+10); Line2D.Double linie3 = new Line2D.Double(oPoint.x+50, oPoint.y-20, oPoint.x+50, oPoint.y+10); g2.draw(linie1); g2.draw(linie2); g2.draw(linie3); g2.setColor(Color.green); g2.setStroke(new BasicStroke(3.0F)); Ellipse2D.Double there = new Ellipse2D.Double(oPoint.x-10, oPoint.y-10, 20, 20); g2.fill(there); start = true; } Meine Methode zum zeichnen einer Strecke: public void drawStrecke(int grad, int strecke, String movement) { g2 = (Graphics2D)this.getGraphics(); Point nPoint = new Point(); g2.setColor(Color.red); if (movement.equals("Links") ) { oGrad = oGrad + grad; } if (movement.equals("Rechts")) { oGrad = oGrad - grad; } if (movement.equals("Links")) { g2.fillOval(oPoint.x-5, oPoint.y-5, 10, 10); g2.drawString(grad+"°", oPoint.x-25, oPoint.y+15); } if (movement.equals("Rechts")) { g2.fillOval(oPoint.x-5, oPoint.y-5, 10, 10); g2.drawString(grad+"°", oPoint.x+5, oPoint.y+15); } if (movement.equals("Gerade")) { nPoint.x = new Double(oPoint.x+(Math.sin(Math.toRadians(oGrad))*strecke)).intValue(); nPoint.y = new Double(oPoint.y+(Math.cos(Math.toRadians(oGrad))*strecke)).intValue(); g2.setStroke(new BasicStroke(3.0F)); g2.draw(new Line2D.Double(oPoint.x,oPoint.y,nPoint.x,nPoint.y)); oPoint = nPoint; } g2 = (Graphics2D)this.getGraphics(); //System.out.println(oGrad); //System.out.println(oPoint); //System.out.println(nPoint); } Vielen Dank im voraus. MFG blueJ Zitieren
bigredeyes Geschrieben 3. Juni 2008 Geschrieben 3. Juni 2008 hallo! du mußt dich selber darum kümmern, dass deine linien wieder gezeichent werden. erbst du von jpanel oder ähnlichem? dann überlade die 'paint(Graphics g)' methode. ich empfehle dir, von deinen linien 'shapes' zu erstellen und diese dann zu speichern. dafür schau dir mal die klasse 'AffineTransform' an. wenn du das so implemetierst, dann kannst du deine linien auch verschieben, zoomen, usw... classMyClass extends JPanel{ Vector<Shape> shapes = new Vector<Shape>(); ..... @Override public void paint(Graphics g){ super.paint(g); Graphics2D g2d = (Graphics2D)g; for(Shape s:shapes){ g2d.drawShape(s); } } } bigredeyes Zitieren
blueJ Geschrieben 3. Juni 2008 Autor Geschrieben 3. Juni 2008 Hi bigredeyes! Vielen Dank für deine Hilfe. Werde mir das mit den Shapes nachher mal angucken und mich dann noch mal melden, wenn es geklappt hat. MFG blueJ Zitieren
blueJ Geschrieben 4. Juni 2008 Autor Geschrieben 4. Juni 2008 Hi! Mit den Shapes war ein super Tip. Hab es jetzt geschafft, dass die Linien und Strings nicht verschwinden. Speicher alles in ArrayListen. public void drawStrecke(int grad, int strecke, String movement) { Point nPoint = new Point(); if (movement.equals("Links")) { oGrad = oGrad + grad; //g2.fillOval(oPoint.x-5, oPoint.y-5, 10, 10); shapes.add(new Ellipse2D.Double(oPoint.x-5, oPoint.y-5, 10, 10)); //g2.drawString(grad+"°", oPoint.x-25, oPoint.y+15); nxtString.add(new NxtString(grad, oPoint.x-25, oPoint.y+15)); } if (movement.equals("Rechts")) { oGrad = oGrad - grad; //g2.fillOval(oPoint.x-5, oPoint.y-5, 10, 10); shapes.add(new Ellipse2D.Double(oPoint.x-5, oPoint.y-5, 10, 10)); //g2.drawString(grad+"°", oPoint.x+5, oPoint.y+15); nxtString.add(new NxtString(grad, oPoint.x+5, oPoint.y+15)); } if (movement.equals("Gerade")) { nPoint.x = new Double(oPoint.x+(Math.sin(Math.toRadians(oGrad))*strecke)).intValue(); nPoint.y = new Double(oPoint.y+(Math.cos(Math.toRadians(oGrad))*strecke)).intValue(); shapes.add(new Line2D.Double(oPoint.x,oPoint.y,nPoint.x,nPoint.y)); oPoint = nPoint; } repaint(); } Thema kann also geschlossen werden. Und danke nochmal. MFG blueJ Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.