Java GUI in Swing und das MVC Paradigma

joesworld

Neues Mitglied
Hallo.
meine Frage gilt dem Event Bereich in Swing.

Ich habe mir schon einige Texte und Quelltexte zum Thema GUI durchgelesen,
allerdings habe ich da immer noch die eine Frage.

Ich versuche eine Viereck zu zeichnen.
Die Klassen sind in verschiedenen Dateien untergebracht.

Mein Problem ist das das Viereck actrect und die Liste drawList
zwar im FrameGUISampel sichtbar sind, allerding sind diese
nicht dem FrameMouseMotionAdapter und FrameMouseAdapter kenntlich.

Desweiteren wird bei FrameMouseAdapter die ersten Schritte getätigt um
das Viereck zu zeichnen. Der FrameMouseMotionAdapter allerdings nichts
von den schon gemachten Interaktion, d.h. der Versuch das Viereck zu zeichnen,
Punkte, Koordinaten etc., kennt.

Ich habe hier schon mit Set und Get Funktionen gearbeitet.
Auch habe ich mich bezüglich des Observer Musters informiert,
allerdings würde ich gerne eure Meinung zu meinem Problem hören.

Info: Wenn alle Klassen in einer Datei sind sollte es funktionieren.

Zusätzlich möchte ich vielleicht Dreiecken oder anderen Objekten zeichnen!

Vielleicht habe ich auch die Grundsätze nicht verstanden!
Anregungen oder Vorschläge welche Themen zum Problem interessant wären, würden mir auch schon weiter helfen.

Java:
public class FrameSample {
	public static void main(String[] args) {
		FrameCommandListener cmd = new FrameCommandListener();
		FrameWindowAdapter wnda = new FrameWindowAdapter();
		FrameComponentAdapter ca = new FrameComponentAdapter();
		FrameMouseAdapter ma = new FrameMouseAdapter();
		FrameMouseMotionAdapter mm = new FrameMouseMotionAdapter();
		
		FrameGUISample gui = new FrameGUISample(wnda,cmd,ca,ma,mm);
	}
}

public class FrameGUISample extends Frame {
	private static Rectangle actrect;
	private static Vector drawlist;
	
	public FrameGUISample(FrameWindowAdapter fwa, FrameCommandListener fcmdl,
			FrameComponentAdapter fcomp, FrameMouseAdapter fmouseadp,
			FrameMouseMotionAdapter mm) {
		super("FrameGUISample");
		setSize(400, 300);
		setLocation(50, 50);
		setVisible(true);

		actrect = new Rectangle(0,0,0,0);
		drawlist = new Vector();
		
		addWindowListener(fwa);
		addKeyListener(fcmdl);
		addComponentListener(fcomp);
		addMouseListener(fmouseadp);
		addMouseMotionListener(mm);
	}

	public void paint(Graphics g) {
		Rectangle r;
		Enumeration e;

		for (e = drawlist.elements(); e.hasMoreElements();) {
			r = (Rectangle) e.nextElement();
			g.drawRect(r.x, r.y, r.width, r.height);
		}
		
		//g.drawRect(actrect.x, actrect.y, actrect.width, actrect.height);
		
		if (actrect.x > 0 || actrect.y > 0) {
			g.drawRect(actrect.x, actrect.y, actrect.width, actrect.height);
		}
	}
}

public class FrameMouseMotionAdapter extends MouseMotionAdapter {
	private Rectangle actrect;
		
	public void mouseDragged(MouseEvent event) {
		int x = event.getX();
		int y = event.getY();
		
		if (x > actrect.x && y > actrect.y) {
			actrect.width = x - actrect.x;
			actrect.height = y - actrect.y;
		}
		event.getComponent().repaint();
	}
}

public class FrameMouseAdapter extends MouseAdapter {
	private Rectangle actrect;
	
	public void mousePressed(MouseEvent event) {
		actrect = new Rectangle(event.getX(), event.getY(), 0, 0);
	}

	public void mouseReleased(MouseEvent event) {
		if (actrect.width > 0 || actrect.height > 0) {
			FrameGUISample.addRectangleElement(actrect);
		}
		event.getComponent().repaint();
	}
}
 

Michael...

Top Contributor
Grundsätzlich würde ich nicht die paint von Frame überschreiben, nimm eine Component oder ein Panel, überschreibe dessen paint und füge es in den Frame ein. Persönlich würde ich Swing stat AWT verwenden. Hier überschreibt man dann die paintComponent(...)

actrect.x und actrect.y sind immer 0 daher wird die Bedingung nie erfüllt
[JAVA=46] if (actrect.x > 0 || actrect.y > 0) {
g.drawRect(actrect.x, actrect.y, actrect.width, actrect.height);
}
}[/code]

Fliegt Dir hier nicht eine NullPointerException?? actrect wird nie initialisisert! Ansonsten was soll hier passieren?
[JAVA=52]public class FrameMouseMotionAdapter extends MouseMotionAdapter {
private Rectangle actrect;

public void mouseDragged(MouseEvent event) {
int x = event.getX();
int y = event.getY();

if (x > actrect.x && y > actrect.y) {
actrect.width = x - actrect.x;
actrect.height = y - actrect.y;
}
event.getComponent().repaint();
}
}[/code]
Hier wird in der mousePressed ein neues Rechteck erzeugt, in der mouseReleased wird dessen Breite und Höhe überprüft, die aber immer 0 sind. Daher wird auch hier die Bedingung nie erfüllt.
Ansonsten habe im Code keine Methode addRectangleElement(...) gefunden.
das repaint() gehört m.M. hier nicht rein sondern in eher in die nicht vorhandene Methode addRectangleElement()
[JAVA=67]public class FrameMouseAdapter extends MouseAdapter {
private Rectangle actrect;

public void mousePressed(MouseEvent event) {
actrect = new Rectangle(event.getX(), event.getY(), 0, 0);
}

public void mouseReleased(MouseEvent event) {
if (actrect.width > 0 || actrect.height > 0) {
FrameGUISample.addRectangleElement(actrect);
}
event.getComponent().repaint();
}
}[/code]
 

joesworld

Neues Mitglied
Hi,
die Idee nicht direkt das paint von Frame überschreiben sondern JPanel paint ist gut,
dies habe ich auch schon in Quelltexten und Beispielen gesehen.
Zu Swing bin ich noch nicht ganz gekommen, das Thema werde ich in kürze bearbeiten.

Zum eigentlichen Problem,
richtig die actrect wird nie initialisiert,
das ist auch eigentlich das Problem und nicht nur das auch die Höhe und Breite des
Rechtecks wird nie an actrect weitergegeben.

Die Methode addRectangleElement wurde von mir im FrameGUISampel Klasse eingepflegt.

Java:
public static void addRectangleElement(Rectangle rect) {
    drawList.add(rect);
}

Auch habe ich mit Set und Get Methoden schon gearbeitet um actrect
X,Y und Höhe, Breite, in der jeweiligen überschriebenen
Mouse und MouseMotion Methode, zu setzen.

Was ich suche ist eine geeignete Struktur oder Methode um Objekte
zu Verwalten und zeichnen?
 

Michael...

Top Contributor
Gewöhn Dir das mit den statischen Variablen und Methoden ab. Statische Zugriffe sind nur sehr selten sinnvoll. Verwende lieber get- und set- Methoden.
In Deinem Fall hast Du in jeder Klasse eine eigene Instanzvariable actrect (in FrameGUISample ist es eine Klassenvariable) die alle zwar gleich heissen, aber nichts miteinander zu tun haben.

Hier mal eine einfache Zeichendemo (Rechteck, Kreis, Dreieck), bin ein bisschen kommentarfaul, aber das meiste sollte sprechend bzw. selbsterklärend sein. Zentrale Rolle spielt beim mir das Interface DrawingObject, dadurch muss das PaintingPanel (View inkl. Model) nichts von den konkreten Figuren (Rechteck, Kreis...) wissen.
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class PaintingDemo2 extends JFrame {
	private PaintingPanel paintPanel;
	private DrawingObject drawingObject;
	private JComboBox combo;
	
	public PaintingDemo2() {
		combo = new JComboBox(new String[] {"Rectangle", "Circle", "Triangle"});
		JButton button  = new JButton("Del");
		JPanel panel = new JPanel();
		panel.add(new JLabel("Figure: "));
		panel.add(combo);
		panel.add(button);
		this.getContentPane().add(panel, BorderLayout.NORTH);
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				paintPanel.clear();
			}
		});
		
		
		paintPanel = new PaintingPanel();
		paintPanel.setBackground(Color.WHITE);
		paintPanel.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				switch (combo.getSelectedIndex()) {
				case 1: drawingObject = new Circle(e.getX(), e.getY()); break;
				case 2: drawingObject = new Triangle(e.getX(), e.getY());break;
				default: drawingObject = new Rectangle(e.getX(), e.getY());
				}
				paintPanel.setCurrentObject(drawingObject);
			}
			public void mouseReleased(MouseEvent e) {
				if (drawingObject!=null && (drawingObject.getHeight()>0 || drawingObject.getWidth()>0)) {
					paintPanel.add(drawingObject);
				}
				drawingObject = null;
				paintPanel.setCurrentObject(null);
			}
		});
		paintPanel.addMouseMotionListener(new MouseMotionAdapter(){
			public void mouseDragged(MouseEvent e) {
				int w = e.getX() - drawingObject.getX();
				int h = e.getY() - drawingObject.getY();
				if (w<0) w = 0;
				if (h<0) h = 0;
				paintPanel.resizeCurrentObject(w, h);
			}
		});
		this.getContentPane().add(paintPanel, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		JFrame frame = new PaintingDemo2();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	class PaintingPanel extends JPanel {
		private List<DrawingObject> objList = new ArrayList<DrawingObject>();
		private DrawingObject actObject;
		
		public void add(DrawingObject obj) {
			this.objList.add(obj);
			this.repaint();
		}
		
		public void setCurrentObject(DrawingObject o) {
			this.actObject = o;
			this.repaint();
		}
		
		public void resizeCurrentObject(int width, int height) {
			this.actObject.setDimension(width, height);
			repaint();
		}
		
		public void clear() {
			this.objList.clear();
			this.actObject = null;
			this.repaint();
		}
		
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.BLACK);
			for (int i=0; i<objList.size(); i++)
				objList.get(i).paintObject(g);
			if (actObject!=null) {
				g.setColor(Color.BLUE);
				actObject.paintObject(g);
			}
		}
	}
	
	interface DrawingObject {
		public void setDimension(int width, int height);
		public int getX();
		public int getY();
		public int getWidth();
		public int getHeight();
		public void paintObject(Graphics g);
	}
	
	class Circle implements DrawingObject {
		private int x, y, w, h;
		
		public Circle(int x, int y) {
			this.x = x;
			this.y = y;
			w = h = 0;
		}
		
		public void setDimension(int width, int height){
			this.w = width;
			this.h = height;
		}
		
		public void paintObject(Graphics g){
			g.drawOval(x, y, w, h);
		}
		public int getX() {return x;}
		public int getY() {return y;}
		public int getHeight() {return h;}
		public int getWidth() {return w;}
	}
	
	class Rectangle implements DrawingObject {
		private int x, y, w, h;
		
		public Rectangle(int x, int y) {
			this.x = x;
			this.y = y;
			w = h = 0;
		}
		
		public void setDimension(int width, int height){
			this.w = width;
			this.h = height;
		}
		
		public void paintObject(Graphics g){
			g.drawRect(x, y, w, h);
		}
		public int getX() {return x;}
		public int getY() {return y;}
		public int getHeight() {return h;}
		public int getWidth() {return w;}
	}
	
	class Triangle implements DrawingObject {
		private int x, y, w, h;
		
		public Triangle(int x, int y) {
			this.x = x;
			this.y = y;
			w = h = 0;
		}
		
		public void setDimension(int width, int height){
			this.w = width;
			this.h = height;
		}
		
		public void paintObject(Graphics g){
			g.drawLine(x, y + h, x + w, y + h);
			g.drawLine(x + w, y + h, x + (w/2), y);
			g.drawLine(x + (w/2), y, x, y + h);
		}
		public int getX() {return x;}
		public int getY() {return y;}
		public int getHeight() {return h;}
		public int getWidth() {return w;}
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
StevenGG Java swing "New Integer" Java Basics - Anfänger-Themen 5
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
M Wie kann ich hier ein Textfeld hinzufügen Java Swing? Java Basics - Anfänger-Themen 1
M Wie kann ich eine Eingabe im Java-Swing übergeben? Java Basics - Anfänger-Themen 1
M Java swing im Browser starten Java Basics - Anfänger-Themen 0
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
S Input/Output In Java Swing auf Button warten? Java Basics - Anfänger-Themen 9
B Java Swing "Zeichenfläche" Java Basics - Anfänger-Themen 1
S Programmoberfläche mit Java-Swing - Herangehensweise Java Basics - Anfänger-Themen 20
V Dropdown Button in einer GUI (Java Swing) Java Basics - Anfänger-Themen 12
S JAVA Swing Eventlistener Java Basics - Anfänger-Themen 11
MisterSeven Java Swing - Wie Frame größe festlegen?! Java Basics - Anfänger-Themen 10
? Konsolenprogramm hat Problem mit java.awt oder javax.swing Java Basics - Anfänger-Themen 7
S Java Swing - JPG in "Zonen" Java Basics - Anfänger-Themen 2
7 Java Swing: Wie JScrollPane zur JList hinzufügen? Java Basics - Anfänger-Themen 12
A java.awt und javax.swing verschwunden Java Basics - Anfänger-Themen 2
X Taschenrechner mit Java Swing Java Basics - Anfänger-Themen 2
A Java Swing als Spezialgebiet Java Basics - Anfänger-Themen 2
C java mit swing serverseitig Java Basics - Anfänger-Themen 9
G LinnienDiagram in java in einem swing Java Basics - Anfänger-Themen 5
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
J Java Testklasse Java Basics - Anfänger-Themen 5
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
W Java code- TicTac toe Java Basics - Anfänger-Themen 51

Ähnliche Java Themen

Neue Themen


Oben