Zweimal im gleichen Paint-Fenster malen

jamesv

Bekanntes Mitglied
Hey Java-Forum-Gemeinschaft,

Mein Problem, dass ich habe, ist:

Wenn ich das Programm starte und zwei Kreise malen möchte, dann öffnen sich zwei Fenster. (Ich habe versucht, dass mittels Threads so zu ändern, dass das eine Fenster zeit versetzt geöffnet wird, das würde theoretisch klappen, nur wird leider der ganze Java-Thread gestoppt und der Nutzer kann keine Eingabe machen.)

Und wenn ich das eine Fenster ausgefüllt habe, mit den Daten, dann öffnet sich ein neues Fenster, in dem der Kreis gemalt wird. Nun fülle ich das zweite Fenster aus und es öffnet sich ein zweites Fenster, was ja klar ist, denn ich instanziere die Klasse ja noch mal, kann ich aber irgendwie, auf das selbe Objekt noch mal zugreifen, sodass aber das vorherige Oval nicht überschrieben wird?

Ich hoffe, ihr könnt mir helfen.
Vielen Dank schonmal im voraus :D

Lg James.


Code:


Klasse Startup:


Java:
package basics;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Startup
extends JFrame
implements ActionListener
{
	Kreis[] k;
	Kreis parent;
	Thread warten;
	Thread kreis;
	JFrame frame;
	Paint zeichnen;
	JLabel label;
	JTextField anzahl;
	JButton enter;
	JButton exit;
	int anz;
	
	private static final long serialVersionUID = 1L;
	
	
	public static void main(String[] args)
	{
		new Startup();
	}

	public Startup()
	{
//		parent.x = getX();
		
		
//		zeichnen = new Paint(x, y, d, fill);
		
//		warten = new Thread();
//		kreis = new Thread();
		
		frame = new JFrame();
		label = new JLabel();
		anzahl = new JTextField();
		enter = new JButton();
		exit = new JButton();
		
		enter.setText("Abschicken");
		exit.setText("Beenden");
		enter.setPreferredSize(new Dimension(120,25));
		exit.setPreferredSize(new Dimension( 120,25));
		
		enter.addActionListener(this);
		exit.addActionListener(this);
		
		anzahl.setPreferredSize(new Dimension(25,20));
		label.setPreferredSize(new Dimension(225,20));
		label.setText("Bitte die gewünschte Anzahl angeben:");
		
		frame.setSize(350,120);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(new FlowLayout(FlowLayout.CENTER, 10,10));
		
		frame.add(label);
		frame.add(anzahl);
		frame.add(enter);
		frame.add(exit);
		
		frame.setVisible(true);
	}

/*
	public void run()
	{
		new Kreis();
	}
	
*/
	
	public void paint(Graphics g)
	{
		super.paint(g);
		g.setColor(Color.red);
		g.fillOval(5, 5, 50, 50);
	}
	
	@Override
	public void actionPerformed(ActionEvent ae)
	{
		if(ae.getSource() == enter)
		{
			frame.dispose();
			anz = Integer.parseInt(anzahl.getText());
//			System.out.println(anz);
			
			for (int i = 0; i < anz; i++)
			{
				new Kreis(this);
//				k[i] = new Kreis();
/*				
				try
				{
					Thread.sleep(2000);
				}
				catch(InterruptedException e)
				{
					System.out.print("Klappt nicht.");
				}
*/				
			}
		}
		else if (ae.getSource() == exit)
		{
			System.exit(0);
		}
	}
}

Klasse Kreis:

Java:
package basics;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Kreis
extends JFrame
implements ActionListener
{
	Paint zeichnen;
	Startup parent;
	JLabel labPosX;
	JLabel labPosY;
	JLabel labDPixel;
	JLabel labFilled;
	JButton enter;
	JButton exit;
	JTextField posX;
	JTextField posY;
	JTextField dPixel;
	JCheckBox filled;
	public int x;
	public int y;
	public int d;
	public boolean fill;
	private static final long serialVersionUID = 1L;
	
	public Kreis(Startup parent)
	{
/*
 	int x = parent.x;
	int y = parent.y;
	int d = parent.d;
	boolean fill = parent.fill;
*/
		this.parent = parent;
		abfrage();
	}
	
	public void abfrage()
	{
		labPosX = new JLabel();
		labPosY = new JLabel();
		
		labDPixel = new JLabel();
		labFilled = new JLabel();
		
		enter = new JButton();
		exit = new JButton();
		
		posX = new JTextField();
		posY = new JTextField();
		
		dPixel = new JTextField();
		filled = new JCheckBox();
		
		labFilled.setText("Kreis gefüllt? Ja/Nein.");
		labPosX.setText("Position X. Bitte angeben.");
		labPosY.setText("Position Y. Bitte angeben.");
		labDPixel.setText("Durchmesser in Pixel.");
		
		enter.setText("Generieren");
		exit.setText("Beenden");
	
		add(labFilled);
		add(filled);
		
		add(labPosX);
		add(posX);
		
		add(labPosY);
		add(posY);
		
		add(labDPixel);
		add(dPixel);
		
		add(enter);
		add(exit);
		
		posX.setPreferredSize(new Dimension(25, 25));
		posY.setPreferredSize(new Dimension(25, 25));
		dPixel.setPreferredSize(new Dimension(25, 25));
		
		enter.setPreferredSize(new Dimension(100, 25));
		exit.setPreferredSize(new Dimension(100, 25));
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(300,400);
		setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));
		setVisible(true);
		
		enter.addActionListener(this);
		exit.addActionListener(this);

	}
	
	@Override
	public void actionPerformed(ActionEvent ae)
	{
		if(ae.getSource() == enter)
		{
			x = Integer.parseInt(posX.getText());
			y = Integer.parseInt(posY.getText());
			d = Integer.parseInt(dPixel.getText());
			fill = filled.isSelected();
			
			dispose();

			new Paint(x, y, d, fill);
//			if(fill)
//			{
//				new FillPaint(x,y,d);
//			}
//			else
//			{
//			new Paint(x,y,d);
//			}
			
		}
		else if(ae.getSource() == exit)
		{
			dispose();
//			System.exit(0);
		}
	}
}


Klasse Paint:

Java:
package basics;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Paint
extends JFrame
{
	Kreis parent;
	JPanel panel;
	boolean fill;
	int d = 0;
	int x = 0;
	int y = 0;
	
	private static final long serialVersionUID = 1L;
	
	public Paint(int x, int y, int d, boolean fill)
	{
		this.x = x;
		this.y = y;
		this.d = d;
		this.fill = fill;
		
/*
 * 		System.out.println(x);
 * 		System.out.println(y);
 * 		System.out.println(d);	
*/	
		panel = new JPanel();
		setSize(450,450);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public void paint(Graphics g)
	{
		super.paint(g);
		g.setColor(Color.white);
		g.fillRect(0, 0, 450, 450);
		g.setColor(Color.black);
		if(!fill)
		{
			g.drawOval(x, y, d, d);
		}
		else
		{
			g.fillOval(x, y, d, d);
		}
	}
}
 
S

SlaterB

Gast
ganz schön wirr, ich nehme an es geht um:
öffne weniger neue Fenster sondern nutze vorhandene,
wenn nur ein Fenster, dann ist es ja leicht,
wenn mindestens zwei, dann übergib etwa das erste ans zweite als Parameter im Konstruktor,
somit kennt das zweite das erste und kann dort was aufrufen statt ein drittes zu erzeugen?

soweit verstanden?
eigentlich nichts neues, wie paar Objekte untereinander kommunizieren gehört zu relativ tiefen Grundlagen weit vor komplizierten Fenstern..
 
S

SlaterB

Gast
ein weiteres Beispiel von: auf eine Nebenfrage geantwortet, zum eigentlichen Thema nichts geschrieben,

ich habe schon geantwortet und weiß nun nicht was ich noch weiteres neues schreiben sollte,
ich weiß nichtmal ob du das Thema schon als gelöst und beendest ansiehst

-------

> Wie meinst du ds weit vor komplizierten Fenstern?

das ist so als wenn du in der Mathematik nach 5+5 fragst bei Integralrechnung,
lange bevor etwas kompliziertes drankommt sollte man die einfachen Dinge kennen, z.B. das ein Objekt an ein anderes übergeben wird
 

jamesv

Bekanntes Mitglied
Also das Thema ist immer noch geöffnet.

Ich markiere die erledigten Threads immer als erledigt :D


Also wie gesagt, ich möchte, dass wenn ich auf den Button Enter klicke passiert folgendes:

Java:
if(ae.getSource() == enter)
		{
			x = Integer.parseInt(posX.getText());
			y = Integer.parseInt(posY.getText());
			d = Integer.parseInt(dPixel.getText());
			fill = filled.isSelected();
			
			dispose();
			
			zeichnen;
			
			new Paint(x, y, d, fill);
		
		}

Als erstes, wird das vorhandene Fenster geschlosse und ein neues Fenster, nämlich das Fenster Paint, wo die Zeichnungen drin sind, erscheint.

Java:
package basics;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Paint
extends JFrame
{
	Kreis parent;
	JPanel panel;
	boolean fill;
	int d = 0;
	int x = 0;
	int y = 0;
	
	private static final long serialVersionUID = 1L;
	
	public Paint(int x, int y, int d, boolean fill)
	{
		this.x = x;
		this.y = y;
		this.d = d;
		this.fill = fill;
		
              	panel = new JPanel();
		setSize(450,450);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public Paint()
	{
		
	}
	public void paint(Graphics g)
	{
		super.paint(g);
		g.setColor(Color.white);
		g.fillRect(0, 0, 450, 450);
		g.setColor(Color.black);
		if(!fill)
		{
			g.drawOval(x, y, d, d);
		}
		else
		{
			g.fillOval(x, y, d, d);
		}
	}
}

So hier wird ein Fenster geöffnet, wo erstmal ein weißes rechteck gezeichnet wird. Auf dieses Rechteck, wird dann der Kreis gezeichnet.


Das Problem:


Wenn ich jetzt zwei Kreise malen möchte, dann werden zwei Fenster geöffnet.
De Facto, sind die Kreise nicht in einem Fenster.


Also ich möchte, dass die Action-Performed-Methode auf das selbe Objekt zugreift.

Wenn ich jetzt davor den "Variablen"namen setzte,
Java:
zeichnen = new Paint(x, y, d, fill);

dann wird ja trotzdem ein zweites Fenster geöffnet. Also müsste ich vorher gucken, ob das Fenster schon aktiv ist.
also

Java:
if(!zeichnen.isActice())
{
     zeichnen = new Paint(x, y, d, fill)
}
else
{

}
Nur weiß ich jetzt nicht, was ich in den Else-Teil reinschreiben soll, da ich ja irgendwie die daten an die Paint Methode bringen muss.



VIelen Dank für deine HIlfe.


lg James
 
S

SlaterB

Gast
grundsätzlich musst du repaint() aufrufen um ein erneutes Zeichnen zu bewirken,
die Varialben zu übergeben ist dann wieder Grundlage

zunächst musst du wissen wie du sie speichern willst, üblicherweise zeichnet ein paint() alles komplett neu,
also brauchst du die Daten vom ersten Kreis auch, falls der noch angezeigt werden soll,
dann alle Variablen doppelt ablegen, unschön, oder eine Liste mit Objekten die die benötigten Informationen enthalten,

der Konstruktor hilft dir in der Tat nicht viel, aber du kannst ja jederzeit eine neue Methode erstellen mit den Parameter
und den Aktionen darin die du gerade brauchst,

also:
- Platz/ Variablen für Information schaffen
- Informationen übergeben
- repaint()
- paint muss alle vorhandenen Informationen korrekt verarbeiten

--------

in einem JFrame mit paint() zu zeichnen ist übrigens schlecht wie es überall steht,
besser in einem JPanel mit paintComponent() malen!

Galileo Computing :: Java ist auch eine Insel – 20 Grafikprogrammierung
Wenn Swing eine Komponente zeichnet, ruft es automatisch die Methode paint() auf. Um eine Grafik selbst in ein Fenster zu zeichnen, ließe sich von JFrame eine Unterklasse bilden und paint() überschreiben – das ist jedoch nicht der übliche Weg.

Stattdessen wählen wir einen anderen Ansatz, der sogar unter AWT eine gute Lösung ist. Wir bilden eine eigene Komponente, eine Unterklasse von JPanel [..]
....
 

jamesv

Bekanntes Mitglied
Hey SlaterB,

sollte ich das in ein Array packen?

Oder kannst du mir vielleicht ein CodeSchnipsel geben, wie du das proggen würdest?


lg James
 

jamesv

Bekanntes Mitglied
ok. Danke :D ist sowieso besser, wenn du mir so hilfst, anstatt mir den Code zu geben.


Dann brauche ich eine Schleife in der Action-performed methode, oder?

Naja vielen Dank, ich denke ich schlafe dann auch noch mal ´ne Nacht drüber. Mal gucken, ob mir was einfällt. Ich melde mich auf jeden Fall.


lg James
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Zweimal dieselbe Methode als Übergabeparameter nutzen Java Basics - Anfänger-Themen 1
B Kann mir jemand erklären, warum hier dreimal was ausgegeben wird und nicht nur zweimal? Java Basics - Anfänger-Themen 16
Z JPanel wird zweimal hinterinander gezeichnet.. Wieso? Java Basics - Anfänger-Themen 4
G Observer löst zweimal aus Java Basics - Anfänger-Themen 8
S Methoden Return Anweisung beendet Methode nicht, stattdessen wird diese zweimal durchlaufen Java Basics - Anfänger-Themen 3
L Next()-Aufruf zweimal innerhalb einer While-Schleife bei ListIterator Java Basics - Anfänger-Themen 10
B Warum ein Objekt mit zweimal new erzeugen? Java Basics - Anfänger-Themen 14
T JComboBox klappt nur ein- bis zweimal auf Java Basics - Anfänger-Themen 30
G Textfeld zweimal Auslesen - Probleme Java Basics - Anfänger-Themen 6
G Propertydatei wird zweimal erstellt ? Wie verhindern? Java Basics - Anfänger-Themen 6
P Frage zu SortedMap: Warum kann ich Item zweimal einfügen? Java Basics - Anfänger-Themen 3
Glühlampe Usereingabe in der gleichen Zeile ausgeben Java Basics - Anfänger-Themen 6
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
N Verschiedene Konstruktoren mit gleichen Datentypen Java Basics - Anfänger-Themen 8
I JPA / Hibernate "Predicate" kombinieren in der gleichen Query Java Basics - Anfänger-Themen 1
sondr Anzahl der gleichen Positionen im Array Java Basics - Anfänger-Themen 3
E Best Practice Konstruktor mit bestehender Intanz der gleichen Klasse aufrufen Java Basics - Anfänger-Themen 4
J Erhöhen eines Values als Integer bei gleichen Keys in HashMap Java Basics - Anfänger-Themen 12
O Array nach gleichen Zahlen prüfen und ausgeben Java Basics - Anfänger-Themen 6
D Liste nach 2 gleichen Einträgen suchen Java Basics - Anfänger-Themen 4
L Eine Klasse aus dem gleichen Package starten Java Basics - Anfänger-Themen 3
B Datentypen Datentyp welcher den gleichen Namen wie die Klasse trägt? Java Basics - Anfänger-Themen 1
N Mit der gleichen BlockingQueue in zwei Klassen arbeiten Java Basics - Anfänger-Themen 12
N Objektvariablen haben den gleichen Wert - warum? Java Basics - Anfänger-Themen 5
AssELAss Datums-Objekt prüfen ob im gleichen Monat? Java Basics - Anfänger-Themen 5
V Anzahl von gleichen Werten in einem Int-Array ermitteln Java Basics - Anfänger-Themen 4
T Classpath Datei an dem gleichen Ort speichern Java Basics - Anfänger-Themen 9
L Array - Nach 2 gleichen Werten stoppen Java Basics - Anfänger-Themen 5
T List mit mehreren gleichen Strings bereinigen Java Basics - Anfänger-Themen 4
S Strings und Binärdaten aus der gleichen Datei auslesen Java Basics - Anfänger-Themen 24
A Datei Lesen und Schreiben in gleichen Klasse Java Basics - Anfänger-Themen 3
C Objekt von Klasse im gleichen Paket erzeugen Java Basics - Anfänger-Themen 8
2 Hashmap mit gleichen Schlüsseln? Java Basics - Anfänger-Themen 3
A Stilfrage: statische Variable mit Instanz der gleichen Klasse Java Basics - Anfänger-Themen 8
B Class wird nicht gefunde obwohl sie im gleichen Ordner liegt Java Basics - Anfänger-Themen 8
G Interfaces mit gleichen Methoden Java Basics - Anfänger-Themen 4
J Verschiedene Ausgaben bei gleichen Ausdrücken (Typecasting?) Java Basics - Anfänger-Themen 5
M mehreren klassen die gleichen funktionen bereitstellen? Java Basics - Anfänger-Themen 3
T 2D Array nach gleichen Werten durchsuchen Java Basics - Anfänger-Themen 6
S DAY_OF_WEEK liefert immer gleichen Wert Java Basics - Anfänger-Themen 6
F Swing - Fehler - Paint Methode Java Basics - Anfänger-Themen 7
S awt: paint Methode zeigt nichts an Java Basics - Anfänger-Themen 9
S Paint Anwendung: Freihandlinien zeichnen Java Basics - Anfänger-Themen 4
S Erste Schritte drawOval Problem in Paint Anwendung Java Basics - Anfänger-Themen 1
R Begrenzer Anzahl von paint() ? Java Basics - Anfänger-Themen 3
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
thet1983 start & paint Methode? Java Basics - Anfänger-Themen 0
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
M Probleme mit paint() aus java.awt.Graphics Java Basics - Anfänger-Themen 2
D Wert einer Variable in paint-Methode verwenden Java Basics - Anfänger-Themen 2
OnDemand Berechnung in die start und paint Methode eines Applets Java Basics - Anfänger-Themen 28
T Vererbung Wann wird die Methode paint aufgerufen? Java Basics - Anfänger-Themen 4
L Paint() wird scheinbar nicht richtig ausgeführt Java Basics - Anfänger-Themen 8
N aus Container components paint Java Basics - Anfänger-Themen 2
J paint() vs repaint() Java Basics - Anfänger-Themen 3
A Problem mit paint() Java Basics - Anfänger-Themen 2
A Aufruf der paint() Methode Java Basics - Anfänger-Themen 3
Dogge Problem mit paint(Graphics g) im Applet Java Basics - Anfänger-Themen 13
J Problem mit paint(Graphics g) Java Basics - Anfänger-Themen 4
L Erste Schritte Swing oder SWT Paint mit Grafikkarte? Java Basics - Anfänger-Themen 7
T paint() wird nicht aufgerufen Java Basics - Anfänger-Themen 2
K paint() mit einfügen Java Basics - Anfänger-Themen 14
K doppeltes paint beim Drucken Java Basics - Anfänger-Themen 8
J paint-methode blockiert settings von JComponents Java Basics - Anfänger-Themen 5
F Eine Frage über paint() Funktion Java Basics - Anfänger-Themen 2
S [Applet] Objekte von init bei paint benutzen Java Basics - Anfänger-Themen 9
R Methoden Zeichnen auf Button-Druck durch Paint-Methode Java Basics - Anfänger-Themen 2
W repaint() ruft paint() nicht auf Java Basics - Anfänger-Themen 9
A paint() methode von externer Klasse aufrufen Java Basics - Anfänger-Themen 3
J Paint Methode von JPanel aufrufen Java Basics - Anfänger-Themen 15
V paint funktioniert nicht Java Basics - Anfänger-Themen 14
Q Zeichnen außerhalb der paint-methode Java Basics - Anfänger-Themen 7
O Paint Programm mit Fehler Java Basics - Anfänger-Themen 2
A Methoden Variablen in paint methode Java Basics - Anfänger-Themen 4
K Problem mit Parameter von paint(Graphics g) Java Basics - Anfänger-Themen 3
Y im applet malen ohne repaint paint ? Java Basics - Anfänger-Themen 6
S Datentypen Paint Programm Java Basics - Anfänger-Themen 7
M paint-Methode funzt nicht Java Basics - Anfänger-Themen 11
L Paint zeichnet nicht gespeicherte Objekte Java Basics - Anfänger-Themen 3
D OOP paint() Methode aus Unterklasse anstoßen Java Basics - Anfänger-Themen 3
A paint() - warum nicht aufrufen? Java Basics - Anfänger-Themen 3
K Scrollbar - Bild - paint-Methode - zoom Java Basics - Anfänger-Themen 10
S super.paint() Java Basics - Anfänger-Themen 4
S Bild aus paint() Methode auslagern Java Basics - Anfänger-Themen 14
T Etwas an paint()-Methode übergeben? Java Basics - Anfänger-Themen 6
TheKing Paint-Methode aufrufen Java Basics - Anfänger-Themen 14
N paint methode statt Event-Handling-Methode Java Basics - Anfänger-Themen 3
M Paint und JColorChooser Java Basics - Anfänger-Themen 12
G hintergrund wird nicht gezeichnet bei paint() Java Basics - Anfänger-Themen 3
H Paint Methode malt nicht im Panel Java Basics - Anfänger-Themen 4
S Frage zur paint-Methode Java Basics - Anfänger-Themen 3
B Applet: Event-Handling-Methode in start- bzw. paint-Methode Java Basics - Anfänger-Themen 7
G Nichtstatische Objekte in der paint()-Methode Java Basics - Anfänger-Themen 16
K Wieso wird "paint" nicht ausgeführt ? Java Basics - Anfänger-Themen 2
K JPanel, JFrame, paint() und wo ist mein Viereck ? Java Basics - Anfänger-Themen 19
F Frage zu JPanel und Paint Java Basics - Anfänger-Themen 5
P paint Methode Java Basics - Anfänger-Themen 3
M Problem mit paint() und Container. Java Basics - Anfänger-Themen 8
B Paint(Component) und externe Objekte Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben