Fadenkreuze löschen und nicht "verstecken"

Status
Nicht offen für weitere Antworten.

BlubBlub

Bekanntes Mitglied
folgendes programm ist gegeben:
dieses programm erzeugt ein fadenkreuz dort wo man mit der maus hinklickt.
wenn man die maus gedrückt hält folgt das fadenkreuz der maus.
lässt man die maustaste los, so bleibt das fadenkreuz auf seiner position stehen.
klickt man wo anders hin, wird der sichtbare inhalt des bildschirms gelöscht und ein fadenkreuz ensteht an der stelle wo man mit der maus hingeklickt hat.
(fadenkreuz = ein kreuz aus einer senkrechten und einer waagerechten linie, die über das ganze fenster gehen)
(hinweis: das fadenkreuz können sie aus rechtecken zusammenfassen).


Java:
public class Main
{
	public static void main(String[] a)
	{
		new MyFrame();
	}
}

Java:
import javax.swing.JFrame;
public class MyFrame extends JFrame 
{
	MyFrame()
	{
		getContentPane().add(new Zeichenflaeche());
		setLocation(100, 100);
		setSize(400, 400);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
	}
}

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JPanel;

public class Zeichenflaeche extends JPanel
{
	Point a;
	
	Zeichenflaeche()
	{
		addMouseListener(new MouseAdapter()	
							{
								public void mousePressed(MouseEvent m)
								{
									a = m.getPoint();
									repaint();
								}
							});
		
		addMouseMotionListener(new MouseMotionAdapter()
								  {
									public void mouseDragged(MouseEvent m)
									{
										a = m.getPoint();
										repaint();
									}
								  });
	}
	
	public void paint(Graphics g)
	{
		g.setColor(getBackground());
		g.fillRect(0, 0, getWidth(), getHeight());
		
		if(a!= null)
			zeichneRechteck(g, a);
	}
	
	public void zeichneRechteck(Graphics g, Point a)
	{
		g.setColor(Color.blue);
		g.drawRect(-1 , -1, (int)a.getX()+1, (int)a.getY()+1);
		g.drawRect( (int)a.getX(), (int)a.getY(), getWidth()-(int)a.getX()+1, getHeight()-(int)a.getY()+1);
	}
}




ich hab da nun mal ne frage zur paint methode:

Java:
    public void paint(Graphics g)
    {
        g.setColor(getBackground());
        g.fillRect(0, 0, getWidth(), getHeight()); // "löscht" alte fadenkreuze

             if(a!= null)
            zeichneRechteck(g, a); //zeichnet neues fadenkreuz
    }


dies hier bewirkt ja, dass das fadenkreuz neugezeichnet wird und die alten fadenkreuze "gelöscht" werden. in wirklichkeit werden sie aber nur hinter dem rechteck versteckt,dass
durch g.fillRect(...) erzeugt wird.
gibt es eine andere möglichkeit, wie man die fadenkreuze auch wirklich löschen könnte und sie nicht einfach nur versteckt?
 
Zuletzt bearbeitet:

Schandro

Top Contributor
Wie willst du das alte Fadenkreuz denn löschen? Es existiert doch nur auf dem gemalten "Bild", das im Fenster angezeigt wird. Wenn du es dort übermalst, ist es weg.
Ich versteh das Problem net, imho gibts kein Problem^^.
 

Marco13

Top Contributor
Ähm - es ist nicht "versteckt". Es existiert wirklich nicht mehr. Ein Pixel kann immer nur eine Farbe haben. Stell' dir den Bildschirm vor als ein Raster, mit Lämpchen, die man ein- und ausschalten kann. Wenn das Fadenkreuz gezeichnet wird, werden in einer senkrechten und waagerechten Linie die Lämpchen augeschaltet (schwarz) und die anderen bleiben an (weiß). Wenn man ein weißes Rechteck mit "fillRect" malt, werden alle Lämpchen eingeschaltet. Dass vorher mal welche aus waren, sieht man dann nicht mehr.

Viel schwieriger wäre es, wenn man das alte Fadenkreuz tatsächlich speichern wollte - dann müsste man die nämlich in einer List<Point> abepeichern. Und NOCH schwieriger wäre es, wenn man mehrere "Schichten" (bestehend aus Fadenkreuz-Rechteck-anderesFadenkreuz-anderesRechteck...) speichern wollte. Aber so ist's ja einfach.

Das "fillRect" heißt also so viel wie "lösche alles" :)

EDIT: Jaja, langsam :oops: aber sicher ist sicher... :)
 

BlubBlub

Bekanntes Mitglied
hmm... also ich hab das so gemeint, dass wenn man

Java:
        g.setColor(getBackground());
        g.fillRect(0, 0, getWidth(), getHeight());

weglässt, wird das rechteck nicht mehr gezeichnet.
wenn ich das programm jetzt starte und das fadenkreuz hin und her schiebe oder neu ansetze und auch hin und herschiebe, bleiben alle erstellten fadenkreuze auf dem JPanel.
verkleiner ich das fenster und vergrößer ich es anschließend wieder, so ist nur noch das zuletzt gezeichnete fadenkreuz zu sehen.
ich möchte aber, dass alle fadenkreuze verschwinden bis auf das zuletzt gezeichnete ohne das fenster selbst einmal zu verkleinern und dann wieder vergrößern zu müßen und ohne der verwendung von g.setColor(getBackground()); und g.fillRect(0, 0, getWidth(), getHeight()); ... es müßte doch irgendwie automatisch zu machen sein dass das fenster sich schnell selbst aktualisiert.


p.s. eure erklärungen hab ich verstanden ;) , trotzdem gibts noch einen anderene weg? (fenster selbst aktualisieren, ohne son hintergrund zu erstellen)
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ja, wenn niemand das Licht aus macht, bleibt es an - und umgekehrt - außer, wenn man das Lämpchenraster wegwirft und sich ein neues bestellt (Fenstergröße ändern...).

Man KÖNNTE theoretisch, in manchen Fällen, mit einigem Aufwand was "murksen": Indem man das alte Kreuz mit der Hintergrundfarbe überzeichnet - aber das wäre den Aufwand nicht wert: Ein einfarbiges fillRect geht so schnell, dass es schneller kaum geht.

Was ist so "schlimm" an dem fillRect? ???:L
 

BlubBlub

Bekanntes Mitglied
ach eigentlich ist nichts an dem fillRect(..) war mir nur nicht sicher ob das ne gängige methode ist oder ob das nur der einfachheithalber erstmal so erstellt wurde.

weil ich hab mir ein beispiel programme aus der vorlesung angeschaut und da stand beispielsweise

Java:
class MyFrame extends JFrame
{
.......

   void setAnzahlRinge(int a)
   {  anzahlRinge = Math.max(a, 0); refresh();  }
......

   void refresh() { setVisible(false); setVisible(true); }

   
   public void paint(Graphics g)
   {
      for (int i=anzahlRinge; i>0; i--)
      {
         new Circle(xPos, yPos, i*anzahlRinge+5.0).
             drawMe(g, (i%2==0)?Color.black:Color.white);
      }
   }
.........


oder void refresh() { update(getGraphics()); }


...nagut jetzt fehlt der bezug weil das nur ausschnitte aus einem größeren programm sind und da wurden dialogfenster und bla und blub verwendet, aber ich hab versucht mir dieses refresh() abzuschauen und wollte das auf meine aufgabe übertragen ohne verwendung des rechtecks. einfach nur weil ich mir nicht sicher war ob das mit dem rechteck ein gängiges verfahren ist.
 

Schandro

Top Contributor
du könntest
Code:
super.paint(g);
am Anfang der paint-Methode schreiben, dann wird auch das komplette Fenster mit der Hintergrundsfarbe übermalt.
=> dasselbe was du bereits "per Hand" machst.

Fallst du wirklich auf keinen Fall das komplette Fenster übermalen willst, dann merk dir halt die Position des letzten Fadenkreuzes und übermal nur dieses mit der Hintergrundsfarbe...
 

BlubBlub

Bekanntes Mitglied
nein nein ich werd das mit dem

rechteck zeichen machen oder mit dem super(...) damit kann ich mich gut anfreunden,
wie gesagt war mir halt unsicher ob man das für gewöhnlich so macht.

danke danke fürs helfen

p.s. meine ursprüngliche aussage :"in wirklichkeit werden sie aber nur hinter dem rechteck versteckt" ist falsch, das hab ich jetzt auch verstanden, es wird ja alles immer wieder neu gezeichnet und keine schichten von rechtecken drübergelegt (so wie ihr es auch mehrfach versucht habt mir zu verdeutlichen)
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Das rechteck zu zeichnen ist üblich ... aber das hier
[c]void refresh() { setVisible(false); setVisible(true); }[/c]
sieht schon SEHR seltsam aus :autsch:
 

Quaxli

Top Contributor
Noch 'ne Anmerkung von mir: Da es sich hier um Swing-Komponenten handelt, sollte nicht paint, sondern paintComponent überschreiben werden....
 

Landei

Top Contributor
Nebenbei: Sowas wie Hilfslinien, Fadenkreuze und so malt man am besten im XOR-Modus. Wenn man sie dann nochmal an die gleiche Stelle malt, sind sie praktischerweise wieder weg.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Element aus comboBox mit observableList löschen AWT, Swing, JavaFX & SWT 3
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Fragerjava Frame inhalt komplett löschen AWT, Swing, JavaFX & SWT 4
missy72 JavaFX CellFactory deaktivieren, oder löschen AWT, Swing, JavaFX & SWT 2
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
C Swing Component bei Doppelklick löschen AWT, Swing, JavaFX & SWT 4
H JTabel Inhalt löschen AWT, Swing, JavaFX & SWT 1
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
R Swing Ein gezeichneten String aus dem JFrame löschen AWT, Swing, JavaFX & SWT 5
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
B JavaFX RadioButtons aus ToggleGroup löschen AWT, Swing, JavaFX & SWT 7
I GEmaltes BufferedImage löschen AWT, Swing, JavaFX & SWT 3
M JavaFX Altes Fenster (FXML Datei) löschen AWT, Swing, JavaFX & SWT 16
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
L Komplettes Löschen SWT vom System AWT, Swing, JavaFX & SWT 6
D JavaFX observablelist löschen AWT, Swing, JavaFX & SWT 3
H Swing Waypoints in JXMapKit löschen AWT, Swing, JavaFX & SWT 1
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
thobren JavaFX Ecken bei radius löschen AWT, Swing, JavaFX & SWT 2
C Swing JTextField Funktion zuweisen - Löschen von Buchstaben/Sonderzeichen AWT, Swing, JavaFX & SWT 6
G JPanel komponente Löschen AWT, Swing, JavaFX & SWT 7
A JFace Wizard: Ist es möglich eine Page zu löschen? AWT, Swing, JavaFX & SWT 2
J Text bei Eingabe löschen AWT, Swing, JavaFX & SWT 5
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
I Objekte aus contentPane löschen funktioniert nicht AWT, Swing, JavaFX & SWT 3
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
llabusch Prüfen ob JMenu leer ist & löschen AWT, Swing, JavaFX & SWT 1
N AWT Markierte Zeile jList aus mySQL DB löschen AWT, Swing, JavaFX & SWT 2
TheJavaKid JTextField: Reine Domain herausfiltern, sonst Inhalt löschen AWT, Swing, JavaFX & SWT 1
M JTable horizontale scrollbar löschen AWT, Swing, JavaFX & SWT 3
Bluedaishi JTable alle Zeilen löschen AWT, Swing, JavaFX & SWT 7
I ausgewählte Zeile mit Hilfe der Tastatur löschen! AWT, Swing, JavaFX & SWT 3
I JTable Inhalte löschen ohne den JTable zu verändern! AWT, Swing, JavaFX & SWT 5
I 2D-Grafik Shape aus BufferedImage "löschen" AWT, Swing, JavaFX & SWT 2
J Einträge aus Table löschen ohne Exception AWT, Swing, JavaFX & SWT 6
A 2D-Grafik Panel inhalt löschen AWT, Swing, JavaFX & SWT 5
H JCombobox inhalt löschen AWT, Swing, JavaFX & SWT 17
earlgrey_tea JTable Zelleninhalt beim Editieren löschen AWT, Swing, JavaFX & SWT 5
Kenan89 removeAll, um alles in einem JPanel zu löschen AWT, Swing, JavaFX & SWT 10
P Listenelemente über Checkbox löschen AWT, Swing, JavaFX & SWT 6
Ollek Swing JTable - Zeile löschen mit AbstractTableModel AWT, Swing, JavaFX & SWT 20
S Swing JTable Zeilen löschen AWT, Swing, JavaFX & SWT 21
4 AWT bestimmte Objekte zeichnen und löschen AWT, Swing, JavaFX & SWT 8
A JTable Zelle markieren von bis und Löschen AWT, Swing, JavaFX & SWT 6
S Swing AWT-Exception bei JTable mit JComboBox beim Löschen der letzten Zeile AWT, Swing, JavaFX & SWT 3
C JFrame - Löschen und neu füllen AWT, Swing, JavaFX & SWT 9
E Swing JTable Inhalte löschen..Was ist Sinnvoll? AWT, Swing, JavaFX & SWT 5
L Inhalt einer table löschen AWT, Swing, JavaFX & SWT 2
H Markierte Zeile löschen AbstractTableModel AWT, Swing, JavaFX & SWT 10
M [erledigt] Bestimmte Zeile aus JTextArea löschen AWT, Swing, JavaFX & SWT 3
F Swing JTable: Problem beim zeile löschen AWT, Swing, JavaFX & SWT 3
M Swing jList Auswahl löschen AWT, Swing, JavaFX & SWT 2
Semox Swing Kreis löschen durch Mausklick in der Nähe AWT, Swing, JavaFX & SWT 2
B Swing JList Daten löschen AWT, Swing, JavaFX & SWT 13
Pithecanthropus Swing Vordefinierten KeyStroke löschen AWT, Swing, JavaFX & SWT 3
S Java3D: Alle Objekte in BranchGroup löschen während Laufzeit AWT, Swing, JavaFX & SWT 3
J ArrayList Datensätze komplett löschen AWT, Swing, JavaFX & SWT 8
L ArrayList Wert löschen klappt nicht AWT, Swing, JavaFX & SWT 11
A Tabellen Spalte löschen AWT, Swing, JavaFX & SWT 6
S Comobox löschen AWT, Swing, JavaFX & SWT 10
U LayoutManager [GBL] Component aus einer Zelle löschen AWT, Swing, JavaFX & SWT 2
R JTable Zeile löschen AWT, Swing, JavaFX & SWT 4
X Keyevents nach Beartbeitung löschen AWT, Swing, JavaFX & SWT 2
E Spalte in JTable löschen AWT, Swing, JavaFX & SWT 4
hdi Swing JTable: Löschen vom Daten im Model AWT, Swing, JavaFX & SWT 7
Z JTextField Text löschen AWT, Swing, JavaFX & SWT 1
D eigenes Tablemodel, Zeile löschen ArrayindexOOB excp AWT, Swing, JavaFX & SWT 4
Junker Fensterinhalt vor ausführen von repaint komplett löschen. AWT, Swing, JavaFX & SWT 2
A Swing JTree Tree Node löschen AWT, Swing, JavaFX & SWT 2
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
M JTexField löschen AWT, Swing, JavaFX & SWT 3
Meldanor JTables - Zeilen hinzufügen/löschen AWT, Swing, JavaFX & SWT 4
M brauche Hilfe um Einträge aus Jlist zu löschen AWT, Swing, JavaFX & SWT 4
Q markierte mails löschen AWT, Swing, JavaFX & SWT 5
C Spalte aus JTable löschen AWT, Swing, JavaFX & SWT 8
nadal15 JTable und ArrayList - selected rows löschen AWT, Swing, JavaFX & SWT 6
F Per KeyListener Zeilen aus JTable löschen AWT, Swing, JavaFX & SWT 9
S Spur löschen. AWT, Swing, JavaFX & SWT 5
A Element aus einer JList löschen AWT, Swing, JavaFX & SWT 5
P [JTree] Icon für Nodes und Leafs ändern bzw. löschen AWT, Swing, JavaFX & SWT 2
hdi super.paintComponent(g); soll nicht alles löschen AWT, Swing, JavaFX & SWT 2
O Fensterinhalt löschen und neu generieren AWT, Swing, JavaFX & SWT 2
P Canvas Inhalt löschen AWT, Swing, JavaFX & SWT 4
W Node aus JTree löschen AWT, Swing, JavaFX & SWT 2
J JTable - Wie Zeilen löschen ? AWT, Swing, JavaFX & SWT 8
Saxony JTextPane - letzte Zeile löschen AWT, Swing, JavaFX & SWT 4
A Zeile in JTable einfügen/löschen- Tutorial gesucht AWT, Swing, JavaFX & SWT 9
W Elemente aus JPanel bzw. GridBag löschen und ersetzen AWT, Swing, JavaFX & SWT 18
T Per Dialog Textfelder löschen AWT, Swing, JavaFX & SWT 4
T Linien zeichnen und wieder löschen AWT, Swing, JavaFX & SWT 9
H Fileinhalt löschen und SWT Dialog erstellen AWT, Swing, JavaFX & SWT 3
G Features nach Update löschen AWT, Swing, JavaFX & SWT 2
G Canvas löschen AWT, Swing, JavaFX & SWT 15
L Probleme mit Löschen von JPanels AWT, Swing, JavaFX & SWT 2
L Alle Inhalte in BorderLayout.CENTER löschen? AWT, Swing, JavaFX & SWT 2
P JTextArea - einzelne Zeile löschen bzw einfügn AWT, Swing, JavaFX & SWT 2
B Formatierungen eines JTextPane löschen AWT, Swing, JavaFX & SWT 4
D Inhalt einer Canvas löschen (SWT.NO_BACKGROUND gesetzt) AWT, Swing, JavaFX & SWT 3
C Zeile aus Tabelle zur Laufzeit löschen AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben