# JPanel nach Menuauswahl



## MarioK (11. Jun 2011)

Hallo Gemeinschaft,
was ich bisher habe:

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MyGraphEditor extends JFrame implements ActionListener{

	private static final long serialVersionUID = 1L;
	private JMenuBar mb;
	private JMenu graph, vertex; 
	private JMenuItem open, neu, save;
	private JMenuItem insert, move, delete, none;
	
	JLabel label = new JLabel("Selected Action");
	JTextField text = new JTextField("none", 20);
	JPanel mitte = new JPanel();
	JPanel unten = new JPanel();
	
	public MyGraphEditor(String s) {
		
		super(s);
		
		// Menu Graph
		mb = new JMenuBar();
		graph = new JMenu("Graph");

		open = new JMenuItem("open");
      	open.addActionListener(this);
      	graph.add(open);

		neu = new JMenuItem("new");
		neu.addActionListener(this);
		graph.add(neu);
		
		save = new JMenuItem("save");
		save.addActionListener(this);
		graph.add(save);
		
		// Menu Vertex
		vertex = new JMenu("Vertex");

		insert = new JMenuItem("insert");
      	insert.addActionListener(this);
      	vertex.add(insert);

		delete = new JMenuItem("delete");
		delete.addActionListener(this);
		vertex.add(delete);
		
		move = new JMenuItem("move");
		move.addActionListener(this);
		vertex.add(move);
		
		none = new JMenuItem("none");
		none.addActionListener(this);
		vertex.add(none);
		
		//Inhalte zufügen und ausrichten
		mb.add(graph);
		mb.add(vertex);
		this.setJMenuBar(mb);

		mitte.setBackground(Color.white);
		
		unten.setLayout(new FlowLayout());
		unten.add(label);
		unten.add(text);

		add(mitte, BorderLayout.CENTER);
		add(unten, BorderLayout.SOUTH);
		
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		
		if (e.getSource() == open) {
			text.setText("Graph:open");
		}
		else if (e.getSource() == neu) {
			text.setText("Graph:new");
		}
		else if (e.getSource() == save){
			text.setText("Graph:save");
		}
		else if (e.getSource() == insert){
			text.setText("Vertex:insert");
			
		}
		else if (e.getSource() == delete){
			text.setText("Vertex:delete");
		}
		else if (e.getSource() == move){
			text.setText("Vertex:move");
		}
		else if (e.getSource() == none){
			text.setText("none");
		}
		
	}
	
	public static void main(String[] args) {
		MyGraphEditor frame = new MyGraphEditor("MyGraphEditor");	
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(800,600);
      	frame.setVisible(true);
	}

	
	
}
```

und


```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class PunktZeichnen extends JPanel implements MouseListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = 5565015365332074583L;
	private ArrayList<Punkt> kreise = new ArrayList<Punkt> ();

	/* Innere Klasse, um Koordinaten eines Kreises abzulegen */
	class Punkt {
		private int x, y, dx, dy;
		public Punkt(int x, int y, int dx, int dy) {
			this.x = x;
			this.y = y;
			this.dx = dx;
			this.dy = dy;
		}
	}


	public PunktZeichnen() {
		addMouseListener(this) ;
		this.setPreferredSize(new Dimension(320,100));
	}

	public void mouseClicked(MouseEvent e) {
		kreise.add(new Punkt(e.getX(), e.getY(), 10, 10));
		repaint();
	}

	public void mouseEntered(MouseEvent e) {};
	public void mouseExited(MouseEvent e) {};
	public void mousePressed(MouseEvent e) {};
	public void mouseReleased(MouseEvent e) {};

	public void paint(Graphics g) {
		super.paint(g);
		g.setColor(Color.black);

		for (Punkt k: kreise) {
			g.fillOval(k.x - k.dx/2, k.y - k.dx/2, k.dx, k.dy);
		}
	}

	/*public static void main(String[] args) {
		JFrame f = new JFrame("Kreise");
		f.setSize(500,500);
		f.getContentPane().add(new PunktZeichnen());
		f.setVisible(true);
	}*/
}
```

Nun zum PRoblem, was ich derzeit nicht lösen kann:
Ich möchte wenn der BEnutzer insert im MEnu auswählt, dass im JPanel mitte ein Punkt(kleiner Kreis) an einer beliebigen Stelle, die der BEnutzer mit der Maus auswählt und innerhalb des PAnels mitte, gezeichnet wird. Aber es will bei mir nicht so wirklich gehen. Habe es probiert mit:

```
else if (e.getSource() == insert){
			text.setText("Vertex:insert");
			mitte.add(new PunktZeichnen());
		}
```
Aber das wäre ja auch zu einfach gewesen. HAbt ihr da ein Tip für mich.


----------



## SlaterB (11. Jun 2011)

nach dem add führe noch
mitte.revalidate(); aus

besser aber generell alle Komponenten initial auf dem Bildschirm verteilen
und abhängig von den Menüoptionen nur die Funktion des Zeichnens im Unterpanel an/abschalten oder ähnliches
(boolean der dort im Listener abgefragt wird)


----------



## MarioK (11. Jun 2011)

SlaterB hat gesagt.:


> ...
> besser aber generell alle Komponenten initial auf dem Bildschirm verteilen
> und abhängig von den Menüoptionen nur die Funktion des Zeichnens im Unterpanel an/abschalten oder ähnliches
> (boolean der dort im Listener abgefragt wird)



Was meinst du damit : alle Komponenten initial auf dem Bildschirm verteilen??

Wird mit den Actions nicht die Funktion des Zeichnens im Unterpanel angeschaltet bzw wenn man einen anderen Punkt wählt der andere abgeschaltet und der neue angeschaltet??


----------



## SlaterB (11. Jun 2011)

im Moment fügst du später ein JPanel ein, diese JPanel, Buttons usw. sind alles Komponenten, 
die am besten alle ganz am Anfang vor setVisible(true) gesetzt werden, nicht später


----------



## MarioK (11. Jun 2011)

Ok hat dank deiner Hinweise sehr gut funktioniert.

Nun "leider" zum nächsten Problem.
Mit dem Menupunkt delete möchte ich die Kreise, die ich mit dem Menupunkt insert im Panel gezeichnet habe wieder weg bekommen, gleichzeitig auch aus der Arraylist Kreise diesen Punkt entfernen. How to????

ich dachte bisher (für den Menupunkt delete): 
1. Ich schreibe eine Klasse zB PunktLoeschen die, wenn man auf einen Punkt im JPanel mitte klickt, überprüft, ob in der ArrayList kreise dieser Punkt vorhanden ist. Ok wenn ja, dann remove diesen Punkt aus der Arraylist und filloval white den vorhandenen Punkt (also verschwindet dieser Punkt damit aus dem JPanel mitte. Wenn der Punkt nicht vorhanden ist in der ArrayList dann passiert nichts.

Soweit so gut die Gedanken, aber ... wenn ich PunktLoeschen aufrufe mit:
mitte.add(new PunktLoeschen()); dann zeichnet er weiter scharze Punkte, wenn ich in das JPanel klicke.

Wo ist mein Fehler ??? Ich denke das mitte.add(usw) ist nicht der richtige Weg, da ja PunktZeichnen noch aktiv ist. Wie kann ich das lösen?


----------



## SlaterB (11. Jun 2011)

evtl. wieder mit revalidate() veranlassen, dass die add()-Befehle auch in sichtbare Bildschirmänderungen umgesetzt werden
(Layout der Komponenten neu bestimmen)

bzw. doch nicht, du hast ja FlowLayout eingestellt, dann bleibt bei einem add() das alte Panel auch noch da, das müsstest du explizit removen bzw. mitte.removeAllComponents()

--------


aber schon komisch wie du da vorgehst, ich bin wie zuvor dafür, nur ein Panel durchgehend zu verwenden,
bei 'delete' kannst du direkt die Liste der Kreise leeren, durch ein repaint() veranlassen dass sie vom Bildschirm verschwinden
und wie gesagt gerne mit einem boolean oder änhliches dafür sorgen, dass der Listener des Panels keine neuen Kreise mehr einfügt 
(so wie evtl. am Anfang, wenn da das Panel auch schon da wäre, boolean an = false; )


----------



## MarioK (11. Jun 2011)

Anfangs hatte ich auch nur ein JPanel, aber meine Vorgabe ist, dass das Ausgabefenster so ausschaut wie es jetzt ist... Mit Verschachtelungen bin ich halt auf das Ergebnis gekommen ... bei nur einem Panel hatte ich das BorderLayout angewendet, aber da war das JLabel und JTextField nicht nebeneinander, so wie es sein sollte ... ich hatte alle Layouts ausprobiert, kam aber zu keinem Ergebnis ..

mitte.removeAll(); entfernt leider auch die gezeichneten Kreise(Punkte) ...

mein einfach gedachte Überlegung war ja: Zeichne in einem Panel die Kreise, dafür eine Methode, und wenn der Benutzer delete auswählt, dann entfernt er halt die Kreise, mit einer Methode, aber so einfach ist es mit JAVA doch leider nicht ... bzw ich kann PunktZeichnen nicht einfach stopen, wenn der Benutzer einen anderen Menupunkt auswählt...


Habel mal noch die Klasse MyGraphEditor umgeschrieben, so dass kein FlowLayout zum Einsatz kommt ... aber nur ein JPanel zu benutzen habe ich noch nicht geschafft:

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MyGraphEditor extends JFrame{

	private static final long serialVersionUID = 1L;
	private JMenuBar mb;
	private JMenu graph, vertex; 
	private JMenuItem open, neu, save, insert, move, delete, none;
	
	JLabel label;
	JTextField text;
	JPanel mitte;
	JPanel unten;
	
	public MyGraphEditor() {
			
		super();
		this.setTitle("MyGraphEditor");
		
		text = new JTextField("none", 20);
		label = new JLabel("Selected Action"); 
		mitte = new JPanel();
		unten = new JPanel();
		
		// Menu Graph
		mb = new JMenuBar();
		graph = new JMenu("Graph");

		open = new JMenuItem("open");
      	open.addActionListener(new MenuAktion());
      	graph.add(open);
      	graph.addSeparator();

		neu = new JMenuItem("new");
		neu.addActionListener(new MenuAktion());
		graph.add(neu);
		graph.addSeparator();
		
		save = new JMenuItem("save");
		save.addActionListener(new MenuAktion());
		graph.add(save);
		graph.addSeparator();
		
		// Menu Vertex
		vertex = new JMenu("Vertex");

		insert = new JMenuItem("insert");
      	insert.addActionListener(new MenuAktion());
      	vertex.add(insert);
      	vertex.addSeparator();

		delete = new JMenuItem("delete");
		delete.addActionListener(new MenuAktion());
		vertex.add(delete);
		vertex.addSeparator();
		
		move = new JMenuItem("move");
		move.addActionListener(new MenuAktion());
		vertex.add(move);
		vertex.addSeparator();
		
		none = new JMenuItem("none");
		none.addActionListener(new MenuAktion());
		vertex.add(none);
		
		//Inhalte zufügen und ausrichten
		mb.add(graph);
		mb.add(vertex);
		this.setJMenuBar(mb);

		mitte.setBackground(Color.white);
		
		unten.add(label);
		unten.add(text);

		this.getContentPane().add(mitte, BorderLayout.CENTER);
		this.getContentPane().add(unten, BorderLayout.SOUTH);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
	class MenuAktion  implements ActionListener{
		
		@Override
		public void actionPerformed(ActionEvent e) {
		
			if (e.getActionCommand() == open.getText()) {
				text.setText("Graph:" + e.getActionCommand());
				
			}
			else if (e.getActionCommand() == neu.getText()) {
				text.setText("Graph:" + e.getActionCommand());
			}
			else if (e.getActionCommand() == save.getText()){
				text.setText("Graph:" + e.getActionCommand());
			}
			else if (e.getActionCommand() == insert.getText()){
				text.setText("Vertex:" + e.getActionCommand());
				mitte.add(new PunktZeichnen());
				mitte.revalidate();
			}
			else if (e.getActionCommand() == delete.getText()){
				text.setText("Vertex:" + e.getActionCommand());
			
			}
			else if (e.getActionCommand() == move.getText()){
				text.setText("Vertex:" + e.getActionCommand());
			}
			else if (e.getActionCommand() == none.getText()){
				text.setText("none");
			}
		}
		
	}
	
	public static void main(String[] args) {
		MyGraphEditor frame = new MyGraphEditor();	
		frame.setSize(800,600);
      	frame.setVisible(true);
	}

}
```


----------



## SlaterB (12. Jun 2011)

> mitte.removeAll(); entfernt leider auch die gezeichneten Kreise(Punkte) ...

<->

> und wenn der Benutzer delete auswählt, dann entfernt er halt die Kreise,

?! was willst du denn nun, dass die Kreise entfernt werden oder nicht?,

---------

> Anfangs hatte ich auch nur ein JPanel, aber meine Vorgabe ist

ob ein Panel oder nicht hat mit Textfeldern usw. wenig zu tun, jedenfalls nicht schlüssig erklärt,
du designst anfangs die GUI, mit Textfeldern, mit Buttons, mit einem JPanel zum Zeichnen, 
das muss funktionieren, wenn nicht anfangs dann später schon gar nicht,
wenn das fertig ist (vor dem initialen setVisible(true) ) dann merke für den Rest des Programms: über add() oder remove() nicht mehr nachdenken!

über alle anderen Probleme wie Kreise zu zeichnen, zu entfernen usw. kann man danach in Ruhe nachdenken,
zu lösen mit Leeren von Listen, repaint() und ähnlichen Aktionen


----------



## MarioK (12. Jun 2011)

delete:
beim Klicken in den Panel bzw Zeichenfläche soll folgende Aktion ausgeführt werden: liegt an der Position des Klicks ein Kreis (Punkt), so soll dieser entfernt werden, d.h. er soll aus der ArrayList entfernt werden und nicht mehr gezeichnet werden. Liegt kein Kreis(Punkt) an der Position des Klicks, so hat das Klicken keine Wirkung.

Ich habe mich mit der GUI von JAVA jetzt das erste Mal auseinandergesetzt. Und was bei rum gekommen ist ja auch. Jetzt gilt es halt zu verbessern.


----------



## MarioK (12. Jun 2011)

so habe jetzt deine vorgeschlagenen boolean´s mit eingebracht und siehe da es geht weiter ... jetzt hänge ich nur noch bei dem deleten fest ... sprich mir fehlt die Anweisung die vergleicht ob, wenn ich im Panel klicke, ein Punkt schon vorhanden ist...

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

public class MyGraphEditor extends JFrame{
	
	private boolean insertPoint = false;
	private boolean deletePoint = false;
	private boolean movePoint = false;
	private boolean nonePoint = false;
	private static final long serialVersionUID = 1L;
	private JMenuBar mb;
	private JMenu graph, vertex; 
	private JMenuItem open, neu, save, insert, move, delete, none;
	
	JLabel label;
	JTextField text;
	JPanel mitte;
	JPanel unten;
	
	public MyGraphEditor() {
			
		super();
		this.setTitle("MyGraphEditor");
		
		text = new JTextField("none", 20);
		label = new JLabel("Selected Action"); 
		mitte = new JPanel();
		unten = new JPanel();
		
		// Menu Graph
		mb = new JMenuBar();
		graph = new JMenu("Graph");

		open = new JMenuItem("open");
      	open.addActionListener(new MenuAktion());
      	graph.add(open);
      	graph.addSeparator();

		neu = new JMenuItem("new");
		neu.addActionListener(new MenuAktion());
		graph.add(neu);
		graph.addSeparator();
		
		save = new JMenuItem("save");
		save.addActionListener(new MenuAktion());
		graph.add(save);
		graph.addSeparator();
		
		// Menu Vertex
		vertex = new JMenu("Vertex");

		insert = new JMenuItem("insert");
      	insert.addActionListener(new MenuAktion());
      	vertex.add(insert);
      	vertex.addSeparator();

		delete = new JMenuItem("delete");
		delete.addActionListener(new MenuAktion());
		vertex.add(delete);
		vertex.addSeparator();
		
		move = new JMenuItem("move");
		move.addActionListener(new MenuAktion());
		vertex.add(move);
		vertex.addSeparator();
		
		none = new JMenuItem("none");
		none.addActionListener(new MenuAktion());
		vertex.add(none);
		
		//Inhalte zufügen und ausrichten
		mb.add(graph);
		mb.add(vertex);
		this.setJMenuBar(mb);

		mitte.setBackground(Color.white);
		
		unten.add(label);
		unten.add(text);

		this.getContentPane().add(mitte, BorderLayout.CENTER);
		this.getContentPane().add(unten, BorderLayout.SOUTH);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
	
	class MenuAktion implements ActionListener{
		
		@Override
		public void actionPerformed(ActionEvent e) {
		
			if (e.getActionCommand() == open.getText()) {
				text.setText("Graph:" + e.getActionCommand());
				
			}
			else if (e.getActionCommand() == neu.getText()) {
				text.setText("Graph:" + e.getActionCommand());
			}
			else if (e.getActionCommand() == save.getText()){
				text.setText("Graph:" + e.getActionCommand());
			}
			else if (e.getActionCommand() == insert.getText()){
				insertPoint = true;
				deletePoint = false;
				movePoint = false;
				nonePoint = false;
				text.setText("Vertex:" + e.getActionCommand());
				mitte.add(new PunktVerarbeiten());
				mitte.revalidate();
			}
			else if (e.getActionCommand() == delete.getText()){
				insertPoint = false;
				deletePoint = true;
				movePoint = false;
				nonePoint = false;
				text.setText("Vertex:" + e.getActionCommand());
				mitte.add(new PunktVerarbeiten());
				mitte.revalidate();
			
			}
			else if (e.getActionCommand() == move.getText()){
				insertPoint = false;
				deletePoint = false;
				movePoint = true;
				nonePoint = false;
				text.setText("Vertex:" + e.getActionCommand());
				mitte.add(new PunktVerarbeiten());
				mitte.revalidate();
			}
			else if (e.getActionCommand() == none.getText()){
				insertPoint = false;
				deletePoint = false;
				movePoint = false;
				nonePoint = true;
				text.setText("none");
			}
		}
		
	}
	
	class PunktVerarbeiten extends JPanel implements MouseListener {

		private static final long serialVersionUID = 5565015365332074583L;
		private ArrayList<Punkt> kreise = new ArrayList<Punkt> ();

		/* Innere Klasse, um Koordinaten eines Kreises abzulegen */
		class Punkt {
			private int x, y, dx, dy;
			public Punkt(int x, int y, int dx, int dy) {
				this.x = x;
				this.y = y;
				this.dx = dx;
				this.dy = dy;
			}
		}


		public PunktVerarbeiten() {
			addMouseListener(this) ;
			this.setPreferredSize(new Dimension(780,500));
			this.setBackground(Color.WHITE);
			this.setBorder(new LineBorder(Color.BLACK));
		}

		public void mouseClicked(MouseEvent e) {
			if (insertPoint){
				kreise.add(new Punkt(e.getX(), e.getY(), 10, 10));
				repaint();
			}
			else if (deletePoint){
				Punkt k = new Punkt(e.getX(), e.getY(), 10, 10);
				if (kreise.contains(k)){
					kreise.remove(new Punkt(e.getX(), e.getY(), 10, 10));
					repaint();
				}
			}
		}

		public void mouseEntered(MouseEvent e) {};
		public void mouseExited(MouseEvent e) {};
		public void mousePressed(MouseEvent e) {};
		public void mouseReleased(MouseEvent e) {};

		public void paint(Graphics g) {
			super.paint(g);
			if (insertPoint){
				g.setColor(Color.black);
				for (Punkt k: kreise) {
					g.fillOval(k.x - k.dx/2, k.y - k.dx/2, k.dx, k.dy);
				}
			}
			
			else if (deletePoint){
				g.setColor(Color.black);
				for (Punkt k: kreise) {
					g.fillOval(k.x - k.dx/2, k.y - k.dx/2, k.dx, k.dy);
				}
			}
		}

	}
	
	
	public static void main(String[] args) {
		MyGraphEditor frame = new MyGraphEditor();	
		frame.setSize(800,600);
      	frame.setVisible(true);
	}

}
```


----------



## SlaterB (12. Jun 2011)

wenn du pixelgenau auf die Mitte klickst, dann funktioniert das vielleicht jetzt schon,
(angenommen dass die Steuerung an sich mit booleans usw. hinhaut)
aber du solltest vielleicht eher die Liste der bisherigen Kreise durchlaufen, den Abstand zum aktuellen Klick-Punkt berechnen
(Satz des Pythagoras) und bei Abstand kleiner radius den Listen-Kreis entfernen


----------



## MarioK (12. Jun 2011)

ich wollte das damit pixelgenau machen :

```
else if (deletePoint){
                Punkt k = new Punkt(e.getX(), e.getY(), 10, 10);
                if (kreise.contains(k)){
                    kreise.remove(new Punkt(e.getX(), e.getY(), 10, 10));
                    repaint();
                }
            }
```
aber es kommt immer false bei raus ... egal ob ich den Punkt genau treffe oder nicht .... er deletet quasi noch nicht ...


----------



## SlaterB (13. Jun 2011)

damit dein neues Punkt-Objekt mit dem alten als übereinstimmend erkannt wird, musst du die equals(Object) Methode richtig implementieren,
Java schaut sich nicht standardmäßig alle Attribute an oder ähnliches


----------



## MarioK (13. Jun 2011)

da muss ich jetzt mal passen .. dafür bräuchte ich ein Beispiel um das zu verstehen ..

um ein Kuchen zu backen brauch ich doch auch nur die Zutaten und muss nicht wissen woher die Zutaten stammen oder wie die Zutaten gewachsen oder entstanden sind ... sorry, aber für solch eine kleine Sache ein so, in meinen Augen, doch komplexer Code ... andere Hochsprachen haben sich da auch nicht so ... aber leider komme ich derzeit nicht an JAVA vorbei bzw ich habe keine andere Wahl ... ;(


----------



## SlaterB (13. Jun 2011)

Galileo Computing :: Java ist auch eine Insel – 9.3 Object ist die Mutter aller Klassen
9.3.3 Objektgleichheit mit »equals()« und Identität

alternativ kannst du immer noch eine Schleife verwenden und eben x/y der Punkte mit den aktuellen x/y der Maus vergleichen,
das ist dann auch etwa derselbe Code der in equals reingehört


----------



## MarioK (13. Jun 2011)

ich werde mir das mal genauer anschauen,

aber,
warum klappt den kein contains?? mit Punkt k = new Punkt(e.getX(), e.getY(), 10, 10); hole ich mir den aktuellen Punkt und mit if (kreise.contains(k)) schaue ich dann doch ob der Punkt in der Liste vorhanden ist. Gut ich weiss dass das bei mir nicht funktioniert, bekomme ja immer false, aber warum? Contains wurde doch deswegen geschaffen um zu überprüfen ob etwas in der List vorhanden ist.


----------



## SlaterB (13. Jun 2011)

aus welchem Grund sollte dein Punkt bzw. Kreis mit einem aus der Liste übereinstimmen um gefunden zu werden?
Java muss das wissen, es gibt wie gesagt keinen automatischen Vergleich aller Attribute oder ähnliches,

String und andere Java-Klassen implementieren die equals-Methode, so dass ein sinnvoller Vergleich ausgeführt wird


----------



## MarioK (13. Jun 2011)

aktuallisierter Code, aber leider geht equals immer noch nicht ...

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

public class MyGraphEditor extends JFrame{
	
	private boolean insertPoint = false;
	private boolean deletePoint = false;
	private boolean movePoint = false;
	private boolean nonePoint = false;
	private static final long serialVersionUID = 1L;
	private JMenuBar mb;
	private JMenu graph, vertex; 
	private JMenuItem open, neu, save, insert, move, delete, none;
	
	JLabel label;
	JTextField text;
	JPanel mitte;
	JPanel unten;
	
	public MyGraphEditor() {
			
		super();
		this.setTitle("MyGraphEditor");
		
		text = new JTextField("none", 20);
		label = new JLabel("Selected Action"); 
		mitte = new JPanel();
		unten = new JPanel();
		
		// Menu Graph
		mb = new JMenuBar();
		graph = new JMenu("Graph");

		open = new JMenuItem("open");
      	open.addActionListener(new MenuAktion());
      	graph.add(open);
      	graph.addSeparator();

		neu = new JMenuItem("new");
		neu.addActionListener(new MenuAktion());
		graph.add(neu);
		graph.addSeparator();
		
		save = new JMenuItem("save");
		save.addActionListener(new MenuAktion());
		graph.add(save);
		graph.addSeparator();
		
		// Menu Vertex
		vertex = new JMenu("Vertex");

		insert = new JMenuItem("insert");
      	insert.addActionListener(new MenuAktion());
      	vertex.add(insert);
      	vertex.addSeparator();

		delete = new JMenuItem("delete");
		delete.addActionListener(new MenuAktion());
		vertex.add(delete);
		vertex.addSeparator();
		
		move = new JMenuItem("move");
		move.addActionListener(new MenuAktion());
		vertex.add(move);
		vertex.addSeparator();
		
		none = new JMenuItem("none");
		none.addActionListener(new MenuAktion());
		vertex.add(none);
		
		//Inhalte zufügen und ausrichten
		mb.add(graph);
		mb.add(vertex);
		this.setJMenuBar(mb);

		mitte.setBackground(Color.white);
		
		unten.add(label);
		unten.add(text);

		this.getContentPane().add(mitte, BorderLayout.CENTER);
		this.getContentPane().add(unten, BorderLayout.SOUTH);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
	
	class MenuAktion implements ActionListener{
		
		@Override
		public void actionPerformed(ActionEvent e) {
		
			if (e.getActionCommand() == open.getText()) {
				text.setText("Graph:" + e.getActionCommand());
				
			}
			else if (e.getActionCommand() == neu.getText()) {
				text.setText("Graph:" + e.getActionCommand());
			}
			else if (e.getActionCommand() == save.getText()){
				text.setText("Graph:" + e.getActionCommand());
			}
			else if (e.getActionCommand() == insert.getText()){
				insertPoint = true;
				deletePoint = false;
				movePoint = false;
				nonePoint = false;
				text.setText("Vertex:" + e.getActionCommand());
				mitte.add(new PunktVerarbeiten());
				mitte.revalidate();
			}
			else if (e.getActionCommand() == delete.getText()){
				insertPoint = false;
				deletePoint = true;
				movePoint = false;
				nonePoint = false;
				text.setText("Vertex:" + e.getActionCommand());
				mitte.add(new PunktVerarbeiten());
				mitte.revalidate();
			
			}
			else if (e.getActionCommand() == move.getText()){
				insertPoint = false;
				deletePoint = false;
				movePoint = true;
				nonePoint = false;
				text.setText("Vertex:" + e.getActionCommand());
				mitte.add(new PunktVerarbeiten());
				mitte.revalidate();
			}
			else if (e.getActionCommand() == none.getText()){
				insertPoint = false;
				deletePoint = false;
				movePoint = false;
				nonePoint = true;
				text.setText("none");
			}
		}
		
	}
	
	class PunktVerarbeiten extends JPanel implements MouseListener {

		private static final long serialVersionUID = 5565015365332074583L;
		private ArrayList<Punkt> kreise = new ArrayList<Punkt> ();
		 
		/* Innere Klasse, um Koordinaten eines Kreises abzulegen */
		class Punkt {
			private int x, y, dx, dy;
			public Punkt(int x, int y, int dx, int dy) {
				this.x = x;
				this.y = y;
				this.dx = dx;
				this.dy = dy;
			}
		}

		@Override
		public boolean equals(Object obj) {
			 if ( ((PunktVerarbeiten) obj).getX() == this.getX() && ((PunktVerarbeiten) obj).getY() == this.getY() ){
				 return true;
			 }
			 return false;
		}


		public PunktVerarbeiten() {
			addMouseListener(this) ;
			this.setPreferredSize(new Dimension(780,500));
			this.setBackground(Color.WHITE);
			this.setBorder(new LineBorder(Color.BLACK));
		}

		public void mouseClicked(MouseEvent e) {
			if (insertPoint){
				kreise.add(new Punkt(e.getX(), e.getY(), 10, 10));
				
				System.out.println(e.getX() + " : " +  e.getY());
				repaint();
			}
			else if (deletePoint){
				
				Punkt t = new Punkt(e.getX(), e.getY(), 10, 10);
				System.out.println(e.getX() + " : " + e.getY());
				for (int x=0; x<kreise.size();x++){
					if(kreise.get(x).equals(t) == true){
						System.out.println("geschafft");
						kreise.remove(t);
						repaint();
					}
				}
			}
		}

		public void mouseEntered(MouseEvent e) {};
		public void mouseExited(MouseEvent e) {};
		public void mousePressed(MouseEvent e) {};
		public void mouseReleased(MouseEvent e) {};

		public void paint(Graphics g) {
			super.paint(g);
			if (insertPoint){
				g.setColor(Color.black);
				for (Punkt k: kreise) {
					g.fillOval(k.x - k.dx/2, k.y - k.dx/2, k.dx, k.dy);
				}
			}
			
			else if (deletePoint){
				g.setColor(Color.black);
				for (Punkt k: kreise) {
					g.fillOval(k.x - k.dx/2, k.y - k.dx/2, k.dx, k.dy);
				}
			}
		}

	}
	
	
	public static void main(String[] args) {
		MyGraphEditor frame = new MyGraphEditor();	
		frame.setSize(800,600);
      	frame.setVisible(true);
	}

}
```

selbst mit der Eclipse generierten Equals MEthode geht das nicht ...

```
@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (!(obj instanceof PunktVerarbeiten))
				return false;
			PunktVerarbeiten other = (PunktVerarbeiten) obj;
			if (!getOuterType().equals(other.getOuterType()))
				return false;
			if (kreise == null) {
				if (other.kreise != null)
					return false;
			} else if (!kreise.equals(other.kreise))
				return false;
			return true;
		}
```


----------



## MarioK (13. Jun 2011)

So ich habe es geschafft und das Ganze auch ohne Equals ... mit 2 ArrayList<Integer> ging es auch ...

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;
 
public class MyGraphEditor extends JFrame{
    
    private boolean insertPoint = false;
    private boolean deletePoint = false;
    private boolean movePoint = false;
    private boolean nonePoint = false;
    private static final long serialVersionUID = 1L;
    private JMenuBar mb;
    private JMenu graph, vertex; 
    private JMenuItem open, neu, save, insert, move, delete, none;
    
    JLabel label;
    JTextField text;
    JPanel mitte;
    JPanel unten;
    
    public MyGraphEditor() {
            
        super();
        this.setTitle("MyGraphEditor");
        
        text = new JTextField("none", 20);
        label = new JLabel("Selected Action"); 
        mitte = new JPanel();
        unten = new JPanel();
        
        // Menu Graph
        mb = new JMenuBar();
        graph = new JMenu("Graph");
 
        open = new JMenuItem("open");
        open.addActionListener(new MenuAktion());
        graph.add(open);
        graph.addSeparator();
 
        neu = new JMenuItem("new");
        neu.addActionListener(new MenuAktion());
        graph.add(neu);
        graph.addSeparator();
        
        save = new JMenuItem("save");
        save.addActionListener(new MenuAktion());
        graph.add(save);
        graph.addSeparator();
        
        // Menu Vertex
        vertex = new JMenu("Vertex");
 
        insert = new JMenuItem("insert");
        insert.addActionListener(new MenuAktion());
        vertex.add(insert);
        vertex.addSeparator();
 
        delete = new JMenuItem("delete");
        delete.addActionListener(new MenuAktion());
        vertex.add(delete);
        vertex.addSeparator();
        
        move = new JMenuItem("move");
        move.addActionListener(new MenuAktion());
        vertex.add(move);
        vertex.addSeparator();
        
        none = new JMenuItem("none");
        none.addActionListener(new MenuAktion());
        vertex.add(none);
        
        //Inhalte zufügen und ausrichten
        mb.add(graph);
        mb.add(vertex);
        this.setJMenuBar(mb);
 
        mitte.setBackground(Color.white);
        
        unten.add(label);
        unten.add(text);
 
        this.getContentPane().add(mitte, BorderLayout.CENTER);
        this.getContentPane().add(unten, BorderLayout.SOUTH);
        
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
    }
    
    class MenuAktion implements ActionListener{
        
        @Override
        public void actionPerformed(ActionEvent e) {
        
            if (e.getActionCommand() == open.getText()) {
                text.setText("Graph:" + e.getActionCommand());
                
            }
            
            else if (e.getActionCommand() == neu.getText()) {
                text.setText("Graph:" + e.getActionCommand());
            }
            
            else if (e.getActionCommand() == save.getText()){
                text.setText("Graph:" + e.getActionCommand());
            }
            
            else if (e.getActionCommand() == insert.getText()){
                insertPoint = true;
                deletePoint = false;
                movePoint = false;
                nonePoint = false;
                text.setText("Vertex:" + e.getActionCommand());
                mitte.add(new PunktVerarbeiten());
                mitte.revalidate();
            }
            
            else if (e.getActionCommand() == delete.getText()){
                insertPoint = false;
                deletePoint = true;
                movePoint = false;
                nonePoint = false;
                text.setText("Vertex:" + e.getActionCommand());
                mitte.add(new PunktVerarbeiten());
                mitte.revalidate();
            
            }
            
            else if (e.getActionCommand() == move.getText()){
                insertPoint = false;
                deletePoint = false;
                movePoint = true;
                nonePoint = false;
                text.setText("Vertex:" + e.getActionCommand());
                mitte.add(new PunktVerarbeiten());
                mitte.revalidate();
            }
            
            else if (e.getActionCommand() == none.getText()){
                insertPoint = false;
                deletePoint = false;
                movePoint = false;
                nonePoint = true;
                text.setText("none");
            }
            
        }
        
    }
    
    class PunktVerarbeiten extends JPanel implements MouseListener {
 
        private static final long serialVersionUID = 5565015365332074583L;
        private ArrayList<Integer> kord1 = new ArrayList<Integer> ();
        private ArrayList<Integer> kord2 = new ArrayList<Integer> ();
              
        public PunktVerarbeiten() {
        	
            addMouseListener(this) ;
            this.setPreferredSize(new Dimension(780,500));
            this.setBackground(Color.WHITE);
            this.setBorder(new LineBorder(Color.BLACK));
            
        }
 
        public void mouseClicked(MouseEvent e) {
        	
            if (insertPoint){
                kord1.add(e.getX());
                kord2.add(e.getY());                
                repaint();
            }
            
            else if (deletePoint){  
                int x1 = e.getX();
                int y1 = e.getY();
                for (int i=0; i<kord1.size() & i<kord2.size(); i++){
                	if(x1 == kord1.get(i) & y1 == kord2.get(i)){
                		kord1.remove(i);
                		kord2.remove(i);
                		repaint();
                	}
                }
            }
            
        }
 
        public void mouseEntered(MouseEvent e) {};
        public void mouseExited(MouseEvent e) {};
        public void mousePressed(MouseEvent e) {};
        public void mouseReleased(MouseEvent e) {};
 
        public void paint(Graphics g) {
        	
            super.paint(g);
            g.setColor(Color.black);
            for (int i=0; i<kord1.size() & i<kord2.size(); i++){
            	g.fillOval(kord1.get(i) - 10/2, kord2.get(i) - 10/2, 10, 10);
            }
             
        }
 
    }
    
    
    public static void main(String[] args) {
    	
        MyGraphEditor frame = new MyGraphEditor();  
        frame.setSize(800,600);
        frame.setVisible(true);
        
    }
 
}
```


----------



## SlaterB (14. Jun 2011)

meine Güte, für Punkt brauchst du equals, Punkt-Objekte sind in der Liste,
nicht die (schlecht benannte) JPanel-Klasse PunktVerarbeiten..


----------



## MarioK (14. Jun 2011)

nur ich habe nicht mehr den just und auch keine Zeit mehr mich mit Nebensächlichkeiten wie equals aufzuhalten .... hier soll es nur um layout und draw gehen .... 

ich danke dir trotz allem dem für deine Mühe ...


----------



## MarioK (14. Jun 2011)

ich habe auch noch einmal deine Kritik zum JPanel beherzigt und alles neu gesetzt.

```
import java.awt.BorderLayout;
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 java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
 
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
  
public class MyGraphEditor2 extends JFrame{

    private PunktVerarbeiten zeichnenFenster = new PunktVerarbeiten();
    private boolean insertPoint = false;
    private boolean deletePoint = false;
    private boolean movePoint = false;
    private boolean nonePoint = false;
    private static final long serialVersionUID = 1L;
    private JMenuBar mb;
    private JMenu graph, vertex; 
    private JMenuItem open, neu, save, insert, move, delete, none;
    
    JLabel label;
    JTextField text;

    public MyGraphEditor2(){
    	
        JFrame frame = new JFrame("MyGraphEditor"); 
        
        // Menu Graph
        mb = new JMenuBar();
        graph = new JMenu("Graph");
 
        open = new JMenuItem("open");
        open.addActionListener(new MenuAktion());
        graph.add(open);
        graph.addSeparator();
 
        neu = new JMenuItem("new");
        neu.addActionListener(new MenuAktion());
        graph.add(neu);
        graph.addSeparator();
        
        save = new JMenuItem("save");
        save.addActionListener(new MenuAktion());
        graph.add(save);
        graph.addSeparator();
        
        // Menu Vertex
        vertex = new JMenu("Vertex");
 
        insert = new JMenuItem("insert");
        insert.addActionListener(new MenuAktion());
        vertex.add(insert);
        vertex.addSeparator();
 
        delete = new JMenuItem("delete");
        delete.addActionListener(new MenuAktion());
        vertex.add(delete);
        vertex.addSeparator();
        
        move = new JMenuItem("move");
        move.addActionListener(new MenuAktion());
        vertex.add(move);
        vertex.addSeparator();
        
        none = new JMenuItem("none");
        none.addActionListener(new MenuAktion());
        vertex.add(none);

        mb.add(graph);
        mb.add(vertex);
        
        JPanel panel = new JPanel(new FlowLayout());
        text = new JTextField("none", 20);
        label = new JLabel("Selected Action");       
        panel.add(label);
        panel.add(text);
        
        frame.setJMenuBar(mb);     
        frame.setLayout(new BorderLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        zeichnenFenster.setPreferredSize(new Dimension(800,500));
        frame.add(zeichnenFenster,BorderLayout.CENTER);
        frame.add(panel,BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        
    }
    
    public static void main(String[] args){
    	
        new MyGraphEditor2();
        
    }
	
    class PunktVerarbeiten extends JComponent implements MouseListener{
	
		private static final long serialVersionUID = 1L;
		private ArrayList<Integer> kord1 = new ArrayList<Integer> ();
    	private ArrayList<Integer> kord2 = new ArrayList<Integer> ();
    	
    	public PunktVerarbeiten() {
    		addMouseListener(this) ;
    	}
    	
    	@Override
    	protected void paintComponent(Graphics g) {
    		
    		super.paintComponent(g);
    		g.setColor(Color.black);
    		for (int i=0; i<kord1.size() & i<kord2.size(); i++){
    			g.fillOval(kord1.get(i) - 10/2, kord2.get(i) - 10/2, 10, 10);
    		}
    		
    	}
    	
    	public void mouseClicked(MouseEvent e) {
        	
            if (insertPoint){
                kord1.add(e.getX());
                kord2.add(e.getY());                
                repaint();
            }
            
            else if (deletePoint){  
                int x1 = e.getX();
                int y1 = e.getY();
                for (int i=0; i<kord1.size() & i<kord2.size(); i++){
                	if(x1 == kord1.get(i) & y1 == kord2.get(i)){
                		kord1.remove(i);
                		kord2.remove(i);
                		repaint();
                	}
                }
            }
            
        }

		public void mouseEntered(MouseEvent arg0) {}
		public void mouseExited(MouseEvent arg0) {}
		public void mousePressed(MouseEvent arg0) {}
		public void mouseReleased(MouseEvent arg0) {}
    	
    }

	class MenuAktion implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
		
			if (e.getActionCommand() == open.getText()) {
				text.setText("Graph:" + e.getActionCommand());           
			}
        
			else if (e.getActionCommand() == neu.getText()) {
				text.setText("Graph:" + e.getActionCommand());
			}
        
			else if (e.getActionCommand() == save.getText()){
				text.setText("Graph:" + e.getActionCommand());
			}
        
			else if (e.getActionCommand() == insert.getText()){
				insertPoint = true;
				deletePoint = false;
				movePoint = false;
				nonePoint = false;
				text.setText("Vertex:" + e.getActionCommand());
			}
        
			else if (e.getActionCommand() == delete.getText()){
				insertPoint = false;
				deletePoint = true;
				movePoint = false;
				nonePoint = false;
				text.setText("Vertex:" + e.getActionCommand());          
			}
        
			else if (e.getActionCommand() == move.getText()){
				insertPoint = false;
				deletePoint = false;
				movePoint = true;
				nonePoint = false;
				text.setText("Vertex:" + e.getActionCommand());
			}
        
			else if (e.getActionCommand() == none.getText()){
				insertPoint = false;
				deletePoint = false;
				movePoint = false;
				nonePoint = true;
				text.setText("none");
			}

		}

	}
	
}
```


----------

