2D-Grafik Linie verschwindet beim Zeichnen

Kaffeebohn

Bekanntes Mitglied
Hallo zusammen,

ich möchte auf einem JPanel eine Linie zeichnen, die wenn man die Maus bewegt, immer von einem fest vorgegebenen Punkt direkt zur Mausposition gezeichnet wird.

Das klappt im Prinzip schon mal. Wenn ich die Methode repaint() nicht aufrufe, wird die Linie so gezeichnet wie sie sein soll, allerdings bleiben vorherige Linien (logischerweiße) erhalten so dass irgendwann ein "Stern" entsteht mit vielen Linien die vom fixen Punkt weggehen.

Sobald ich nun jedoch die Methode .repaint() aufrufe, sieht man die Linie nur wenn man die Maus bewegt (flackert auch etwas). Sobald die Maus stillsteht, ist nichts mehr von der Linie zu sehen. Ich dachte eigentlich, wenn man die repaint() Methode vor dem Zeichnen aufruft, wird das MouseDragged-Event nicht noch mal durchlaufen, solange man die Maus stillhält.

Anbei mal der Code-Ausschnitt des MouseDragged Listener Event, ist aus einem etwas größeren Programm rausgenommen:

Java:
public void mouseDragged(MouseEvent e) {

// Soll eigentlich die Linien löschen die nicht mehr gebraucht werden
repaint();
getGraphics().drawLine(c1.x+(c1.width/2), c1.y+(c1.height/2), e.getPoint().x, e.getPoint().y);

}

Lasst euch bitte von den Koordinaten nicht verwirren, die stimmen soweit schon.


Vielen Dank im Vorraus und liebe Grüße,

Kaffeebohn
 

Landei

Top Contributor
Es sollte wirklich nur in paintComponent (in Ausnahmefällen in paint) gezeichnet werden, nirgendwo sonst. Glaube mir, isso.

In deinem Listener kannst du z.B. eine Liste mit Koordinaten füllen bzw. mit clear wieder löschen, die dann in paintComponent zum Zeichnen der Linien verwendet werden kann.
 
S

SlaterB

Gast
und noch mehr Text:

repaint() zeichnet nichts, sondern besagt, dass demnächst, wenn mal Zeit ist, alles neu gezeichnet werden soll,
das passiert zwischen den ständigen Mouse-Events, deshalb das Flackern, denn jedes 'normale Zeichnen' wird alles löschen

ganz am Ende nach dem letzten mouseDragged wird das letzte paint ausgeführt welches dann auch wieder alles löscht,

----

grundsätzlich als Anfänger NIE getGraphics() aufrufen, stattdessen kannst du in mouseDragged nur die Anfang/End-Komponenten in Klassenattributen speichern und richtigerweise repaint() aufrufen,
wenn dann intern paintComponent(Graphics g) zum Zeichnen drankommt, hast du diese Methode hoffentlich überschrieben und dort darfst du unter kontrollierten Bedingungen (auch weitgehend gegen Flackern geschützt) die Linie malen,
dank der Klassenattribute weißt du ja wo

so funktioniert kurz gesagt das Zeichnen in Swing
 

Kaffeebohn

Bekanntes Mitglied
Huhu,

vielen Dank das geht ja fix. Habs jetzt bisl umgeworfen und in die paintComponent() geworfen und es klappt.


Danke :))

Liebe Grüße
 

Michael...

Top Contributor
Grundsätzlich gilt für AWT und Swing: niemals getGraphics() aufrufen - ausser man weiss, was man tut bzw. mit was man rechnen muss.

Bei AWT Komponenten wird/sollte nur innerhalb von der überschriebenen paint(Graphics g) und bei Swing Komponenten nur innerhalb der überschriebenen paintComponent(Graphics g) unter Verwendung des dort übergebenen Graphics Objekts gezeichnet werden. Bsp:
Java:
class PaintPanel extends JComponent {		
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawLine(0, 0, 10, 10);
	}
}
Soll etwas dauerhaft erhalten bleiben kann man es (wie oben die Linie) fest in diese Methode implementieren oder man muss die dazu notwendigen Informationen (z.B. in einem Objekt) vorhalten.
 
S

SlaterB

Gast
Habs jetzt bisl umgeworfen und in die paintComponent() geworfen und es klappt.
wie kann man lange an so einem Problem sitzen, einen aufwändigen Forum-Beitrag schreiben und dann nur 10 Min. nach der Erstellung auf ein kompliziertes anderes Verfahren gekommen sein und das bereits erfolgreich getestet haben + die neue Antwort schreiben? ;)

vom Lesen der Antworten zwischendurch ganz zu schweigen, dann wäre ja noch viel weniger Zeit
 

slawaweis

Bekanntes Mitglied
man kann schon getGraphics() aufrufen, für den XOR Modus. In diesem Fall, wo während des Mausziehens eine Vorschau auf das Ergebnis dargestellt wird, ist XOR sowieso zu empfehlen.

Slawa
 
S

SlaterB

Gast
in einem Zeichenprogramm mit Vorschau würde ich auch normale repaint()-Mechanismen einsetzen,
wie im ersten Post beschrieben: wenn man die Maus bewegt flackert es, man kann die bearbeitete Kante zwar erahnen,
bewegt man die Maus dann aber nicht mehr bei gedrückter Taste ist gar nix zu sehen, das ist in keiner Weise hilfreich

edit zur unteren Antwort:
ok, wenn man das repaint() wegnimmt und die vorherige Linie manuell löscht, kommt man wohl zum Ziel
 
Zuletzt bearbeitet von einem Moderator:

slawaweis

Bekanntes Mitglied
Von welchem XOR Modus sprichst Du? Ich kenne nur, dass man für das Graphics Objekt den XOR Modus setzen kann, aber der hat ja nur was mit der Farbe bzw. dem Zeichnen direkt zu tun und nichts mit dem Aufruf von getGraphics() an einer Component.
ich sprechen von dem "setXORMode" in Graphics. Wenn man im XOR Modus eine Linie zeichnet, ist diese zu sehen. Wenn man die selbe Linie noch mal zeichnet, ist diese weg und der Hintergrund hergestellt. Das ist eine Technik aus der Computergrafik, damit für bestimmte Zeichnungen (wie die Vorschau), nicht die ganze Ansicht neugezeichnet werden muss. Den XOR Modus kennt man z.B. aus Grafikprogrammen, wenn man ein Auswahlrechteck aufzieht. Bei jeder Mausbewegung das gesamte Bild neuzuzeichnen würde bei komplexen Operationen nicht mehr in Echtzeit funktionieren.

setXORMode in paintComponent() aufzurufen hat wenig Sinn, da dort normalerweise die ganze Ansicht neugezeichnet wird. Am besten ist es also mit getGraphics beim Mausziehen zu verwenden.

Slawa
 
Zuletzt bearbeitet:

Kaffeebohn

Bekanntes Mitglied
wie kann man lange an so einem Problem sitzen, einen aufwändigen Forum-Beitrag schreiben und dann nur 10 Min. nach der Erstellung auf ein kompliziertes anderes Verfahren gekommen sein und das bereits erfolgreich getestet haben + die neue Antwort schreiben? ;)

vom Lesen der Antworten zwischendurch ganz zu schweigen, dann wäre ja noch viel weniger Zeit


Naja manchmal sieht man vielleicht nicht wie leicht die Lösung eigentlich ist, vor allem wenn man nicht so viel Erfahrung im Thema hat. Freuen wir uns doch lieber dass es jetzt klappt wie es klappen soll :) Ich für meinen Teil bin zumindest sehr zufrieden.

Die Antwort kam ja direkt nach meinem Post und ich hab ihn direkt gelesen und konnte es auch direkt umsetzen :)

Liebe Grüße
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A gezeichnete Linie verschwindet, wenn ich JMenuBar öffne AWT, Swing, JavaFX & SWT 2
M JavaFX Diagonale Linie nicht ausgegeben/angezeigt AWT, Swing, JavaFX & SWT 1
G Linie mit der Maus auswählen AWT, Swing, JavaFX & SWT 5
G JavaFX Line Chart mit Farbverlauf/Gradient in Linie AWT, Swing, JavaFX & SWT 1
L 2D-Grafik Linie von Kreis zu Kreis AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
K JavaFX Linie immer in der Mitte der Szene halten AWT, Swing, JavaFX & SWT 12
L JavaFX Horizontale Linie zur Scene binding AWT, Swing, JavaFX & SWT 3
3 2D-Grafik BasicStroke dash pattern - Linie zu lang!? AWT, Swing, JavaFX & SWT 1
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
I Pfeil zeichnen am Ende einer Linie AWT, Swing, JavaFX & SWT 1
javampir Kubische Interpolation einer Linie AWT, Swing, JavaFX & SWT 5
C AWT Horizontale Linie in einem Panel AWT, Swing, JavaFX & SWT 12
B Linie zwischen 2 Elementen AWT, Swing, JavaFX & SWT 5
propra Auf einem JPanel gezeichnete Linie auswählen AWT, Swing, JavaFX & SWT 3
Gossi 2D-Grafik Linie erweitern? AWT, Swing, JavaFX & SWT 10
V Linie mit Länge und Bogenmaß AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Linie hat Löcher AWT, Swing, JavaFX & SWT 10
P 2D-Grafik Neue Farbe für einen Teilbereich einer Linie? AWT, Swing, JavaFX & SWT 8
I Schrift und Farbe formatieren, und zwar pro Linie... AWT, Swing, JavaFX & SWT 4
C Swing JTable: Horizontale Linie bei einzelnen Zellen ausblenden AWT, Swing, JavaFX & SWT 5
G SWT Linie unter transparentes Canvas zeichnen AWT, Swing, JavaFX & SWT 4
B SWT Linie soll in Abhängigkeit der aktuellen Uhrzeit gezeichnet werden AWT, Swing, JavaFX & SWT 16
M Labels in ScrollPane mit Linie verbinden AWT, Swing, JavaFX & SWT 2
R JPanel - zeichnen in skalierten Bereich - Linie (X-Achse) nicht sichtbar AWT, Swing, JavaFX & SWT 11
J Swing - ich sehe keine Linie, andere schon AWT, Swing, JavaFX & SWT 6
S JXTaskPane und gepunktete Linie AWT, Swing, JavaFX & SWT 2
G SWT Linie AWT, Swing, JavaFX & SWT 13
F Rahmen mit gestrichelter Linie zeichnen AWT, Swing, JavaFX & SWT 4
G Linie nach Höhe einer Zahl zeichnen? AWT, Swing, JavaFX & SWT 3
M Linie zwischen JComponents AWT, Swing, JavaFX & SWT 5
T Linie langsam zeichnen AWT, Swing, JavaFX & SWT 3
L Linie mit drawLine auf JPanel AWT, Swing, JavaFX & SWT 7
S Problem mit dem Zeichnen einer Linie auf einem JPanel AWT, Swing, JavaFX & SWT 30
TheJavaKid Kreis, Rechteck, Linie. verschieben AWT, Swing, JavaFX & SWT 5
Student "Dicke" einer Linie - Line2D.Double AWT, Swing, JavaFX & SWT 12
R drawLine gibt hässliche linie AWT, Swing, JavaFX & SWT 4
T Vertikale Linie abgeschnitten AWT, Swing, JavaFX & SWT 2
C Linie in einem JLabel AWT, Swing, JavaFX & SWT 14
G linie / vektor zeichnen AWT, Swing, JavaFX & SWT 2
K Linie wird falsch auf Panel gezeichnet AWT, Swing, JavaFX & SWT 11
M JButtons mit Linie verbinden AWT, Swing, JavaFX & SWT 4
DonBronson Gezeichnetes Objekt verschwindet nachdem erneut gezeichnet wird AWT, Swing, JavaFX & SWT 8
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
E Button verschwindet nachdem ein Rechteck gezeichnet wurde AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
E Swing Text verschwindet AWT, Swing, JavaFX & SWT 1
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
javampir Java FX Text verschwindet nicht AWT, Swing, JavaFX & SWT 9
A Swing Koordinatensystem wird gezeichnet verschwindet aber und die Einteilungen bleiben nicht bestehen AWT, Swing, JavaFX & SWT 5
R TriangleMesh verschwindet teilweise beim resizen des Frames, sowie beim rotieren? AWT, Swing, JavaFX & SWT 1
T AWT JTextfield verschwindet AWT, Swing, JavaFX & SWT 10
S LayoutManager TextField verschwindet / wird klein AWT, Swing, JavaFX & SWT 4
D Swing JOptionPane verschwindet beim 2. Aufruf einfach so?? AWT, Swing, JavaFX & SWT 2
J JPanel verschwindet... AWT, Swing, JavaFX & SWT 8
L Border verschwindet durch Graphics.drawImage() AWT, Swing, JavaFX & SWT 4
frankred Swing JMenu verschwindet nicht beim klicken ausserhalb des JMenu! AWT, Swing, JavaFX & SWT 4
P Swing Jtable mit Delete Button (Button verschwindet nicht bei Delete)) AWT, Swing, JavaFX & SWT 5
G Menü verschwindet durch .setText() AWT, Swing, JavaFX & SWT 4
J JTextArea verschwindet bei resize vom JFrame AWT, Swing, JavaFX & SWT 2
N JMenuBar verschwindet nicht nach ComponentEvent AWT, Swing, JavaFX & SWT 6
S JCheckBoxMenuItem - Haekchen verschwindet bei Icon AWT, Swing, JavaFX & SWT 3
S Beim Painten auf JPanel verschwindet das Bild :( AWT, Swing, JavaFX & SWT 10
Iron Monkey SwingWorker verschwindet nicht AWT, Swing, JavaFX & SWT 10
O JPanel Zeichnung verschwindet AWT, Swing, JavaFX & SWT 4
F Zeichnung verschwindet bei Nutzung von einem Layout AWT, Swing, JavaFX & SWT 6
R JTable Headerbeschriftung verschwindet AWT, Swing, JavaFX & SWT 3
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
R Panel verschwindet AWT, Swing, JavaFX & SWT 2
P JTextArea text verschwindet bei mausklick AWT, Swing, JavaFX & SWT 5
R Bei JDialog verschwindet der Inhalt aus übergeordneten Frame AWT, Swing, JavaFX & SWT 2
X Durch DrawLine verschwindet das Fenster und die Objekte AWT, Swing, JavaFX & SWT 13
G Zeichnung verschwindet nach verändern der Fenstergröße. AWT, Swing, JavaFX & SWT 2
N WindowsLookAndFeel>JFrame/JDialogTitelleiste verschwindet AWT, Swing, JavaFX & SWT 4
K Zeichnung verschwindet. AWT, Swing, JavaFX & SWT 21
C Menue verschwindet hinter AWT-List Box.wie beheben? AWT, Swing, JavaFX & SWT 3
M JMenu verschwindet unter ScrollPane AWT, Swing, JavaFX & SWT 3
G wie verschwindet Konsole? AWT, Swing, JavaFX & SWT 3
V JDialog "verschwindet" beim umschalten in der Task AWT, Swing, JavaFX & SWT 9
R JFrame verschwindet sofort hiner dem Hauptframe AWT, Swing, JavaFX & SWT 9
M Menüleiste verschwindet AWT, Swing, JavaFX & SWT 6
H Hintergrundbild im Panel verschwindet sofort AWT, Swing, JavaFX & SWT 6
I Swing: Menü verschwindet beim Einfügen eines Bildes AWT, Swing, JavaFX & SWT 15
D DropDownSelection Box verschwindet hinter JTextArea AWT, Swing, JavaFX & SWT 2
Z bei kleinen Buttons verschwindet Schrift, obwohl Platz wäre AWT, Swing, JavaFX & SWT 5
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
berserkerdq2 Wie greife ich auf ein Element zu, welches ich beim Scenebuilder erstellt habe AWT, Swing, JavaFX & SWT 10
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
B Output GUI funktioniert nur beim ersten Mal richtig. AWT, Swing, JavaFX & SWT 4
A JavaFX exportierte Jar ohne beim starten die Libs hinzufügen? AWT, Swing, JavaFX & SWT 2
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
S Fehler beim Öffnen weiterer FXML AWT, Swing, JavaFX & SWT 11
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
G Gui updated beim zweiten Aufruf nicht mehr AWT, Swing, JavaFX & SWT 15
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
W Nullpointer Exception beim übertragen von Daten von Scene zu Scene AWT, Swing, JavaFX & SWT 6
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben