Java 2D-Grafik Rectangles
Frage
Ich bin versucht, ein Java-Applet zu machen, den ich erlaubt, eine Grafik Datenstruktur in einer Leinwand zu ziehen. Ich werde dies tun, indem Sie auf, wo ich Knoten erstellen möchten, und klicken Sie die Knoten um sie zu verbinden. Das Problem ist, ich kann nicht die paint()
Methode richtig zu verhalten bekommen. Ich füge neuen Knoten das Graphen (und Quadrate auf der Leinwand) innerhalb der mousePressed(MouseEvent e)
Methode verwenden,
Graphics g = this.getGraphics();
g.setColor(Color.blue);
g.fillRect(e.getX(), e.gety(), 40, 40);
Alles funktioniert gut, bis ich die Größe des Fensters, und dann werden alle gefüllten Rechtecke verschwinden. Ich overrided die Farbe Methode nur eine leere Methode, aber das gleiche passiert immer noch. Ich kann nicht fügen Sie die fillRect innerhalb Farbe Befehle (), weil ich weiß nicht, welche Rechtecke existieren, bis der Benutzer mit ihr interagiert mit der Maus.
Wie kann ich g.fillRect()
innerhalb der Maus-Listener-Methoden verwenden, und sie halten?
Lösung
Das Problem ist der Ort, den Sie sind Zeichnung ist nicht persistieren. Zu jeder Zeit können Sie alles verlieren Sie es gezeichnet haben. Die Farbe (Graphics) -Methode wird aufgerufen, wenn dies geschieht. Verringern Sie entweder das gesamte Bild dies geschieht jedes Mal neu zu zeichnen, oder Sie werden beiseite eine Leinwand setzen müssen, um zu ziehen und den Inhalt in Ihr Applet Graphics kopieren nach Bedarf.
Hier ist, wie ein Bild erstellen und zeichnen:
http://java.sun.com/docs/books/tutorial/2d/images/drawonimage.html
Dann in Ihrer Farbe Methode, verwenden Sie Graphics drawImage (...) Methode um das Bild anzuzeigen Sie erstellt haben.
Andere Tipps
Ich weiß nicht, ob ich das richtig zu lesen bin, aber warum speichere nicht nur die Position des letzten Klick in einer Variablen später lackiert werden, wenn die Farbe () -Methode aufgerufen wird?
Sie haben das Fenster Resize-Aktion Hörer außer Kraft zu setzen und rufen Sie
Die Grafik ist zeitlich begrenzt. Wenn eine Region verschmutzt ist, wird es neu gestrichen werden. Der beste Weg ist es, eine BufferedImage zu schaffen, malen, um es auf mouse und rufen repaint.
Wenn Farbe genannt wird, zeichnet das Bild auf das Graphics-Objekt übergeben. Auf diese Weise brauchen Sie nicht die Rectangles zu speichern und Sie haben einen Puffer, der die Leistung verbessern.