Verstehe ActionListener in Verbindung mit JMenuItem

Status
Nicht offen für weitere Antworten.

Orri

Mitglied
Hallo

hab ein Prog wo ein Menu mit Untermenu zu finden ist.
Was muss eine Aktion ausgelöst wird wenn ich auf ein UntermenuPunkt klicke.

Menu wird mit richtig und komplett angezeigt.

Code:
private static final long serialVersionUID = 1L;
	
	private JLabel label_ref;
	private JButton buton_ref;
	private JMenuBar menubar_ref;
	private JMenu menu1_ref;

	private StdEingabe instream_ref = new StdEingabe();
	
	
	public GUI()
	{
		//Label
		this.setTitle("Körper");
		this.setLayout(new FlowLayout());
		intGUI();
		this.setSize(500, 300);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		this.add(label_ref);
		this.setVisible(true);
		
		erstelleMenu();
	}//end constructor
	
	private void intGUI()
	{
		label_ref = new JLabel();
		menubar_ref = new JMenuBar();
		buton_ref = new JButton();
		
		
	}//end method ingGUI
	
	private void erstelleMenu()
	{
		//Menu
		this.setJMenuBar(menubar_ref);
		menu1_ref = new JMenu("Körper erstellen ");
				
		//Untermenüs zum Hauptmenu hinzufügen 
		menubar_ref.add(menu1_ref);
				
		//1 Untermenu erstellen 
		menu1_ref.add(new JMenuItem("Quader"));
		menu1_ref.setActionCommand("1");
		menu1_ref.addActionListener(this);
		menu1_ref.add(new JMenuItem("Pyramide"));
		menu1_ref.setActionCommand("2");
		menu1_ref.addActionListener(this);
		menu1_ref.add(new JMenuItem("Zylinder"));
		menu1_ref.setActionCommand("3");
		menu1_ref.addActionListener(this);
		menu1_ref.add(new JMenuItem("Kugel"));
		menu1_ref.setActionCommand("4");
		menu1_ref.addActionListener(this);
		menu1_ref.addSeparator();
		menu1_ref.add(new JMenuItem("Beenden"));
		menu1_ref.setActionCommand("5");
		menu1_ref.addActionListener(this);


		
		
	}//end mehtod erstelleMenu
	
	public static void main(String[] args)
	{
		GUI gui_ref = new GUI();
		
		
	}//end method main
	
	
	[COLOR="Blue"]public void actionPerformed(ActionEvent aktion_ref)
	{
				
		String string_ref=aktion_ref.getActionCommand();
		
		if(string_ref.equals("Quader"))
		{
			neuesFensterFürEingabe();
		}
			
		
		
		JMenuItem source= (JMenuItem)(aktion_ref.getSource());
		
		if(source.getClass().getName().equals("Quader"))
		{
			neuesFensterFürEingabe();
					}
		
		[/COLOR]	}
	public void neuesFensterFürEingabe()
	{
		
		//neues Frame erstellen
		JFrame frame_ref = new JFrame("Quader erstellen ");
		frame_ref.setLayout(new GridLayout(3,2));
		frame_ref.setSize(300, 200);
		frame_ref.setVisible(true);
		
		//Schliest alle Fenster
		//frame_ref.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		//GridTextfeld + Eingabefeld
		frame_ref.add(new JLabel("Hoehe eigeben "));//.setFont(new Font("sanserif", Font.PLAIN, 16));
		frame_ref.add(new TextField("Hier kommt ihre Eingabe rein" ,10));
		frame_ref.add(new JLabel("Breite eingeben"));
		frame_ref.add(new TextField("Hier kommt ihre Eingabe rein" ,10));
		frame_ref.add(new JLabel("Hoehe eingeben"));
		frame_ref.add(new TextField("Hier kommt ihre Eingabe rein", 10));
		
		//Autosize 
		//frame_ref.pack();
		
	}

Den Blau umranden Abschitt verstehe ich nicht
Wird die Action als String abgespeichert oder wie ist es jetzt.
Kann ich dann equals(String) benutzen um an die richtige Aktion zu kommen

Wäre schön wenn mir einer das an einem Beispiel erklären könnte
Vielen Dank im Voraus



PS: Hab schon SuFu und Google benutzt , java.sun.com/books/totrium... auch
PPS: Entschuldigung für den unschönen Still und vllt in den falschen bereich gepostet.
 
Code:
	[COLOR="Blue"]public void actionPerformed(ActionEvent aktion_ref)
	{
				
		String string_ref=aktion_ref.getActionCommand();
		
		if(string_ref.equals("Quader"))
		{
			neuesFensterFürEingabe();
		}
			
		
		
		JMenuItem source= (JMenuItem)(aktion_ref.getSource());
		
		if(source.getClass().getName().equals("Quader"))
		{
			neuesFensterFürEingabe();
					}
		
		[/COLOR]

Den Blau umranden Abschitt verstehe ich nicht
Wird die Action als String abgespeichert oder wie ist es jetzt.
Kann ich dann equals(String) benutzen um an die richtige Aktion zu kommen

Hey. Mit den Funktionen getActionCommand(); und setActionCommand(String); kannst du einem Objekt das eine Action sendet (in deinem Fall ein Menü Item) einen String zuweisen durch den sich das Objekt eindeutig identifizieren lässt. Du musst also einem erstellten JMenuItem mittels setActionCommand einen String zuweisen. In deiner actionPerformed Methode kannst du dann diese ACtion Commands vergleichen.

In dem von dir geposteten Beispiel setzt du das ActionCommand allerdings nicht auf die MenüItems, sondern auf die Menüleiste, das ist ein Fehler.

Wenn du zum Beispiel so deine Menüeinträge hinzufügst:

Code:
JMenuItem quader = new JMenuItem("Quader");
		menu1_ref.add(quader);
		quader.setActionCommand("1");

funktioniert die Action Methode so:

Code:
public void actionPerformed(ActionEvent aktion_ref)
	{
		if(aktion_ref.getActionCommand().equals("1"))
		{
			Befehl();
		}
 
Zuletzt bearbeitet:
vielen lieben dank hat mir sehr geholfen
weiss jetzt auch genau wo der fehler ist (referencen) :applaus:
 
noch ne Frage ist mir heute aufgekommen. 😉

was macht eigentlich diese "this" in addActionListener(this)?
meiner Meinung nach wird der Frame übergerben bzw das Objekt. Ist es richtig? und wenn ja wie kann man es serstezen. Möchte das es besser lesbar ist. (klarer)
 
Ja genau. this ist das Objekt selbst. Deine Klasse implementiert ja das Interface ActionListener um auf die Buttonaktionen zu reagieren. Dem ActionListener wird ein Objekt der Klasse übergeben das die Action behandeln soll (in dem Fall halt this, also das Objekt selbst). Alternativ könntest du eine neue Klasse schreiben die das Interface ActionListener implementiert und die ActionPerformed Methode dort einfügen. Dann erzeugst du in der Klasse mit den Buttons ein Objekt dieser Action Klasse und übergibst es den ActionListenern.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben