# Actionlistener für MenuItem



## Börger (4. Jan 2008)

Hallo alle zusammen,

ich bin noch am lernen von Java und soll ne gui für eine projektarbeit machen.....
Also hab schon mein hauptfenster in ner klasse und in einer anderen klasse ein zweites fenster für diverse einstellungen.

So jetzt soll das Einstellungen Fenster auf gehen, wenn ich Einstellungen in der MenuBar drücke oder per Tastenkombi.

Also das hab ich:


```
//Einstellungen
			JMenuItem ms = new JMenuItem("Einstellungen", 'E');
			setAAccelerator(ms,'E');
			ms.addActionListener(this);
			ret.add(ms);
```
 und die Einstellungsklasse heißt schlicht Einstellungen.

und jetzt fehlts mir. hab keine ahnung wie ich jetzt dem programm sagen kann das es bei betätigung die klasse einstellungen aufmachen soll!

so hab ich probiert was aber nicht gefunzt hat:


```
public void actionPerformed(MenuEvent eve)
	{
		if(eve.getActionCommand() == ms)
		{
			new Einstellungen();
		}
	}
```

kann mir da mal jemand auf die sprünge helfen?

ach so hier noch nen bisl zur Tastenkombi fals das relevant sein könnte:


```
private void setAAccelerator(JMenuItem ms, char as)
	{
		KeyStroke ks3 = KeyStroke.getKeyStroke( as, Event.ALT_MASK);
		ms.setAccelerator(ks3);
	}
```

Danke schon mal im voraus

Peace der Börger


----------



## André Uhres (4. Jan 2008)

Die Klasse Einstellungen sollte von JDialog abgeleitet sein.
Nachdem du sie mit "new" instanziert hast musst du sie mit setVisible(true) sichbar machen:

```
Einstellungen einstellungen = new Einstellungen();
einstellungen.setVisible(true);
```


----------



## Börger (4. Jan 2008)

heißt dass dann extends JDialog...?

wenn ja is das eben doof weil ich ja in der Einstellungsklasse nen Actionlistener brauch und den gibts doch nich im JDialog oder??

na jedenfalls noch nen problem zur if schleife. also noch mal der code: 
	
	
	
	





```
public void actionPerformed(MenuEvent eve)
   {
      if(eve.getActionCommand() == ms)
      {
         new Einstellungen();
      }
   }
```
nun erkennt der aber das ms nicht (can not be resolved) obwohl ichs doch auch als ms.addActionListener(true) angegeben hab.

für hilfe währ ich echt dankbar

ach so ich nutz eclipse fals das was zur sache tut!

peace Heiko


----------



## Gast2 (4. Jan 2008)

> ms.addActionListener(true)


ist auch falsch--> er will keinen boolean übergeben sondern einen ActionListener


----------



## Börger (4. Jan 2008)

und das soll heißen? anstatt true was anderen?

bin doch noch ganz am anfang mit meinen kenntnissen

peace heiko


----------



## Börger (4. Jan 2008)

ach bin doch auch doof man das sollte doch nen this werden ja steht ja auch so drinn .

geht aber trotzdem nich.

also alles nochmal:

ms.addActionListener(this)

so.

jetzt brauch ich aber eure hilfe


----------



## Gast2 (4. Jan 2008)

wie sieht die fehlermeldung aus
und dann hast du 2 Möglichkeiten dein JMenuItem abzufragen

```
if(eve.getSource()==ms).....

oder

if(eve.getActionCommand()==ms.getActionCommand())
```


----------



## Börger (4. Jan 2008)

wenn ich daneben auf das mänchen mit dem roten x klick sagt er 
create local variable 'ms'

aber die habsch doch schon 

wie bekomm ich denn ne genaue fehlermeldung raus?

peace


----------



## Börger (4. Jan 2008)

hab auch schon beide varianten probiert aber der kennt mein ms nicht!

bei deiner variante 2 sagt er mir dann aber :
Add cast to 'eve'

peace


----------



## Gast2 (4. Jan 2008)

dein ms muss auch ein attribut sein und keine lokale variable in deinem Konstrukto schick mal den ganzen code


----------



## Börger (4. Jan 2008)

nun gut


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

public class bildschirm
extends JFrame
implements ActionListener
{
	private static final long serialVersionUID = 1L;
	private static final String[] MONTHS = {

	    "Januar",    "Februar", "März",     "April",

	    "Mai",       "Juni",    "Juli",     "August",

	    "September", "Oktober", "November", "Dezember"

	  };

	public bildschirm()
		{
			super("JAudioEdit");
			addWindowListener(new WindowClosingAdapter(true));
			JMenuBar menubar = new JMenuBar();
			menubar.add(createFileMenu());
			menubar.add(createPrefMenu());
			menubar.add(createHalpMenu());
			
			setJMenuBar(menubar);
			
		    JList list = new JList(MONTHS);
		    list.setToolTipText("Wählen Sie ihren Geburtsmonat aus");
		    getContentPane().add(new JScrollPane(list), BorderLayout.CENTER); 
		    
		    
		    JPanel buttonPanel = new JPanel(new GridLayout(9,2));
		    
		    JLabel free1 = new JLabel("");
		    buttonPanel.add(free1);

		    JButton button1 = new JButton("Hinzufügen");
		    button1.addActionListener(this);
		    button1.setToolTipText("Datei Hinzufügen");
		    buttonPanel.add(button1);
		    
		    JLabel free2 = new JLabel("");
		    buttonPanel.add(free2);

		    JButton button2 = new JButton("Entfernen");
		    button2.addActionListener(this);
		    button2.setToolTipText("Datei Entfernen");
		    buttonPanel.add(button2);
		    
		    JLabel free3 = new JLabel("");
		    buttonPanel.add(free3);

		    JButton button3 = new JButton("Hoch");
		    button3.addActionListener(this);
		    button3.setToolTipText("Datei nach oben schieben");
		    buttonPanel.add(button3);
		    
		    JLabel free4 = new JLabel("");
		    buttonPanel.add(free4);
		    
		    JButton button4 = new JButton("Runter");
		    button4.addActionListener(this);
		    button4.setToolTipText("Datei nach unten schieben");
		    buttonPanel.add(button4);
		    
		    JLabel free9 = new JLabel("");
		    buttonPanel.add(free9);
		    
		    JLabel free10 = new JLabel("");
		    buttonPanel.add(free10);

		    //buttonPanel.setBorder(BorderFactory.createEtchedBorder()); 
		    
		    JLabel field1 = new JLabel("<html><u>Datei Info:</u></hlml>");
		    buttonPanel.add(field1);
		    
		    JLabel free6 = new JLabel("");
		    buttonPanel.add(free6);
		    
		    JLabel field2 = new JLabel("Encoding:");
		    buttonPanel.add(field2);
		    
		    JTextField feld2 = new JTextField("");
		    buttonPanel.add(feld2);
		    
		    JLabel field3 = new JLabel("Filetype:");
		    buttonPanel.add(field3);
		    
		    JTextField feld3 = new JTextField("");
		    buttonPanel.add(feld3);
		    
		    JLabel field4 = new JLabel("Chanals:");
		    buttonPanel.add(field4);
		    
		    JTextField feld4 = new JTextField("");
		    buttonPanel.add(feld4);

		    getContentPane().add(buttonPanel, BorderLayout.EAST);
		}
	
	private JMenu createFileMenu()
		{	
			JMenu ret = new JMenu("Datei");
			ret.setMnemonic('D');
			JMenuItem mi;
			//öffnen
			mi = new JMenuItem("Dateiliste laden", 'l');
			setCtrlAccelerator(mi, 'L');
			mi.addActionListener(this);
			ret.add(mi);
			//Speichern
			mi = new JMenuItem("Dateiliste speichern", 'p');
			setCtrlAccelerator(mi, 'S');
			mi.addActionListener(this);
			ret.add(mi);
			//Speichern unter
			mi = new JMenuItem("Dateiliste speichern_unter", 'u');
			setAltAccelerator(mi, 'S');
			mi.addActionListener(this);
			ret.add(mi);
			//Separator
			ret.addSeparator();
			//Beenden
			mi = new JMenuItem("Beenden", 'e');
			mi.addActionListener(this);
			ret.add(mi);
			return ret;
		}

	private JMenu createPrefMenu()
		{
			JMenu ret = new JMenu("Bearbeiten");
			ret.setMnemonic('B');
			JMenuItem mi;
			
			//Einstellungen
			JMenuItem ms = new JMenuItem("Einstellungen", 'E');
			setAAccelerator(ms,'E');
			ms.addActionListener(this);
			ret.add(ms);
			//Konvertierung
			mi = new JMenuItem("Konvertierung starten", 'o');
			setCtrlAccelerator(mi, 'K');
			mi.addActionListener(this);
			ret.add(mi);
			return ret;
		}
	
	private JMenu createHalpMenu()
	{
		JMenu ret = new JMenu("Hilfe");
		ret.setMnemonic('H');
		JMenuItem mi;
		//Info
		mi = new JMenuItem("Info", 'n');
		setCtrlAccelerator(mi, 'I');
		mi.addActionListener(this);
		ret.add(mi);
		return ret;
	}
	
	private void setAltAccelerator(JMenuItem mi, char acs)
		{
			KeyStroke ks2 = KeyStroke.getKeyStroke( acs, Event.ALT_MASK);
			mi.setAccelerator(ks2);
		}
	private void setAAccelerator(JMenuItem ms, char as)
	{
		KeyStroke ks3 = KeyStroke.getKeyStroke( as, Event.ALT_MASK);
		ms.setAccelerator(ks3);
	}
	
	private void setCtrlAccelerator(JMenuItem mi, char acc)
		{
			KeyStroke ks = KeyStroke.getKeyStroke( 
			acc, Event.CTRL_MASK);
			mi.setAccelerator(ks);
		}
	
	public void actionPerformed(ActionEvent event)
	{
		System.out.println(event.getActionCommand());
	}
	public void actionPerformed(MenuEvent eve)
	{
		if( eve.getActionCommand() == ms.getActionCommand())
		{
			Einstellungen einstellungen =new Einstellungen();
			einstellungen.setVisible(true);
		}
	}
	
	public static void main(String[] args)
	  {
		bildschirm frame = new bildschirm();
	    frame.setLocation(100, 100);
	    frame.pack();
	    frame.setVisible(true);
	  }

}
```

und die einstellungen


```
import java.awt.event.*;

import java.awt.*;

import javax.swing.*;



public class Einstellungen

extends JFrame
//extends JDialog

implements ActionListener

{

  /**
	 * 
	 */
	private static final long serialVersionUID = 1L;


	


	public Einstellungen()

  {

    super("Einstellungen");
       
    //Panel für checkboxen
    
    JPanel checkboxPanel = new JPanel(new GridLayout(0,4));
    
    JCheckBox checkbox1 = new JCheckBox("K-Anz. ändern");    
    checkbox1.addActionListener(this);    
    checkboxPanel.add(checkbox1);
    
    JLabel label1 = new JLabel("");
    checkboxPanel.add(label1);
    
    JLabel label2 = new JLabel("");
    checkboxPanel.add(label2);
    
    JLabel label3 = new JLabel("");
    checkboxPanel.add(label3);
     
    JCheckBox checkbox2 = new JCheckBox("Lautst. ändern");    
    checkbox2.addActionListener(this);    
    checkboxPanel.add(checkbox2);
    
    JLabel label8 = new JLabel("");
    checkboxPanel.add(label8);
    
    JLabel label9 = new JLabel("");
    checkboxPanel.add(label9);
    
    JLabel label10 = new JLabel("");
    checkboxPanel.add(label10);
    
    JLabel label11 = new JLabel("");
    checkboxPanel.add(label11);
    
    JLabel label12 = new JLabel("um ein. best. Wert");
    checkboxPanel.add(label12);
    
    JLabel label13 = new JLabel("ändern");
    checkboxPanel.add(label13);
     
    JTextField field1 = new JTextField();
    checkboxPanel.add(field1);
    
    JLabel label15 = new JLabel("");
    checkboxPanel.add(label15);
    
    JLabel label16 = new JLabel("auf ein. best. Wert");
    checkboxPanel.add(label16);
    
    JLabel label17 = new JLabel("normalisieren");
    checkboxPanel.add(label17);
    
    JTextField field2 = new JTextField();
    checkboxPanel.add(field2);
    
    JLabel label19 = new JLabel("");
    checkboxPanel.add(label19);
    
    JLabel label20 = new JLabel("");
    checkboxPanel.add(label20);
    
    JLabel label21 = new JLabel("Bezugspunkt");
    checkboxPanel.add(label21);
    
    JSlider slider1 = new JSlider();
    checkboxPanel.add(slider1);
    
    JCheckBox checkbox3 = new JCheckBox("Samplt. ändern");    
    checkbox3.addActionListener(this);    
    checkboxPanel.add(checkbox3);
    
    JLabel label23 = new JLabel("");
    checkboxPanel.add(label23);
    
    JTextField field3 = new JTextField();
    checkboxPanel.add(field3);
    
    JTextField field4 = new JTextField();
    checkboxPanel.add(field4);
    
    JLabel label26 = new JLabel("");
    checkboxPanel.add(label26);
    
    JLabel label27 = new JLabel("");
    checkboxPanel.add(label27);
    
    JLabel label28 = new JLabel("");
    checkboxPanel.add(label28);
    
    JTextField field5 = new JTextField();
    checkboxPanel.add(field5);
         
    getContentPane().add(checkboxPanel, BorderLayout.WEST);
    


    //Panel mit den Buttons hinzufügen

    JPanel buttonPanel = new JPanel(new GridLayout(0,4));
    
    JButton button1 = new JButton("Einst. laden");
    button1.addActionListener(this);
    button1.setToolTipText("--");
    buttonPanel.add(button1);
    
    buttonPanel.setBorder(BorderFactory.createEtchedBorder());
    
    JLabel label50 = new JLabel("");
    buttonPanel.add(label50);
    
    JLabel label51 = new JLabel("");
    buttonPanel.add(label51);
    
    JLabel label52 = new JLabel("");
    buttonPanel.add(label52);

    JButton button2 = new JButton("E. speichern");
    button2.addActionListener(this);
    button2.setToolTipText("--");
    buttonPanel.add(button2);
    
    JLabel label53 = new JLabel("");
    buttonPanel.add(label53);
    
    JButton button3 = new JButton("OK");
    button3.addActionListener(this);
    button3.setToolTipText("--");
    buttonPanel.add(button3);
    
    JButton button4 = new JButton("Abbrechen");
    button4.addActionListener(this);
    button4.setToolTipText("--");
    buttonPanel.add(button4);

	getContentPane().add(buttonPanel, BorderLayout.SOUTH);   
    

    //Windows-Listener

    addWindowListener(new WindowClosingAdapter(true));

  }

  	public static void main(String[] args)

  {

	Einstellungen frame = new Einstellungen();

    frame.setLocation(100, 100);

    frame.pack();

    frame.setVisible(true);

  }

	public void actionPerformed(ActionEvent event) 
	{
		System.out.println(event.getActionCommand());
		
	}

}
```

soll aufgerufen werden


das iser (nur noch nen windowsclosingadapter aber der is klar)

danke schonmal


----------



## Gast2 (4. Jan 2008)

ja also mach dein ms doch als attribut dann müsste es klappen....


----------



## Börger (4. Jan 2008)

als attribut?

kannst du mir bitte mal nen beispiel posten?


----------



## Gast2 (4. Jan 2008)

ja so wie dein String[] months....


```
class Test

private JMenuitem ms;

public Test()
{

ms=....
}
```


----------



## Börger (4. Jan 2008)

mh ok danke werds mal probieren

peace börger


----------



## Börger (4. Jan 2008)

so habs mal gemacht.

jetzt erkennt er sie ms, gibt keine fehlermeldung diesbezüglich zurück.... ABER es passiert nichts!

das ding macht das einstellungs-fenster nicht auf!

mann mann mann ich werd hier noch wahnsinnig

aber das kommt auch noch die ganze zeit:
2008-01-04 22:08:02.741 java[249] CFLog (0): CFMessagePort: bootstrap_register(): failed 1103 (0x44f), port = 0xd403, name = 'java.ServiceProvider'
See /usr/include/servers/bootstrap_defs.h for the error codes.
2008-01-04 22:08:02.742 java[249] CFLog (99): CFMessagePortCreateLocal(): failed to name Mach port (java.ServiceProvider)

was isn das? hat das was damit zu tun?


----------



## Leroy42 (5. Jan 2008)

Börger hat gesagt.:
			
		

> aber das kommt auch noch die ganze zeit:
> 2008-01-04 22:08:02.741 java[249] CFLog (0): CFMessagePort: bootstrap_register(): failed 1103 (0x44f), port = 0xd403, name = 'java.ServiceProvider'
> See /usr/include/servers/bootstrap_defs.h for the error codes.
> 2008-01-04 22:08:02.742 java[249] CFLog (99): CFMessagePortCreateLocal(): failed to name Mach port (java.ServiceProvider)



Keine Ahnung! Nie gehört!

Aber so macht das alles sowieso keinen Sinn!

Schnapp dir erstmal ein gutes Tutorial (z.B. die Javainsel) und arbeite
dort die notwendigen Kapitel durch.


----------



## Börger (5. Jan 2008)

ja das hab ich ja schon hab auch schon alles ausprobiert, sowohl JDialog als auch JFrame. beide Fenster einzeln funktionieren super aber ich kann das einstellungen Fenster nicht vom Bildschirm fenster aus aufrufen. hab auch schon bis zur verzweiflung gegoogled aber nichts brauchbares gefunden.

üprigens kam die fehlermeldung heut wie durch ein wunder nicht mehr.

Ich versteh auch nicht wieso ich dazu nichts im netz find weils ja auch bei jedem popeligen programm in der menüzeile ne einstellung gibt wo dann nen neues fenster aufgeht??? bin echt am ende meines geringen wissens ;-)

vieicht kann mir ja noch jemand nen guten tipp geben.

peace der Börger


----------



## java2000 (5. Jan 2008)

Hier hast du ein Beispielprogramm, indem über das Menu Fenster erzeugt und angezeigt werden.
Die Fenster, die erzeugt werden kannst du auf verschiedene Arten erzeugen, hier sind zwei gezeigt:
1. Das JFrame hat eine eigene Klasse, von der ein Objekt instanziert wird
2. Der JDialog wird einfach zusammengebastelt, wenn du ihn aufrufst und ihn anzeigst.

Variante 1 halte ich für etwas übersichtlicher, aber das musst du selber wissen.


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

public class Demo_Frame extends JFrame
{

public Demo_Frame() {
	/**
	 * Konsttruktor für das Haupfenster. Es wird eine MenuBar kreiirt
	 * und angehängt. Ausserdem wird ein JLabel ins Fenster gelegt.
	 * Das Fenster ist danach soweit bereit und muss nur noch durch
	 * .setVisible(true) sichtbar gemacht werden. Dies passiert hier im main
	 */
	super("Demo_Frame");
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	JMenu menu = createMyMenu(this);
	JMenuBar menuBar = new JMenuBar();
	menuBar.add(menu);
	this.setJMenuBar(menuBar);
	this.add(new JLabel("   Demo_Frame"));
	this.setSize(200,200);
	this.setLocationByPlatform(true);

} // Konstruktor Demo_Frame

public static void main(String[] args) {
	/**
	 * Das main erstellt das Objekt Demo_Frame, also das Hauptfenster
	 * Dieses setzt es sichtbar und ist damit bereits fertig
	 */
	Demo_Frame frame = new Demo_Frame();
	frame.setVisible(true);
}


private JMenu createMyMenu(final Demo_Frame owner) {
	/**
	 * Diese Methode kreiirt ein JMenu für die JMenuBar des Hauptfensters
	 * Der Parameter owner, muss für den JDialog mitgegeben werden, damit der
	 * einen "owner" bekommt, ein "Besitzer". Weil er in einem actionPerfomed
	 * aufgerufen wird, muss er final sein.
	 */

	JMenu ret = new JMenu("Das Menu");

	JMenuItem mi = new JMenuItem("JFrame");
	mi.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent event) {
			// Für dieses JFrame habe ich eine eigene Klasse geschrieben. Siehe unten
			MyFrame myframe = new MyFrame();
			myframe.setVisible(true);
		}
	} );
	ret.add(mi);

	mi = new JMenuItem("JDialog");
	mi.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				// Dieser JDialog wird hier in diesem actionPerformed instanziert und angezeigt
				JDialog dialog = new JDialog(owner,"JDialog");
				dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
				JLabel label = new JLabel("   Ich bin ein JDialog");
				dialog.add(label);
				dialog.setSize(400,600);
				dialog.setLocation(300,300);
				dialog.setVisible(true);
			}
	} );
	ret.add(mi);

	return ret;
} // createMyMenu

} // class Demo_Frame

class MyFrame extends JFrame {
	/**
	 * Dies ist die Klasse für das Frame, das aufgerufem wird
	 */
	public MyFrame() {
		super("JFrame");
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		JLabel label = new JLabel("   Ich bin ein JFrame");
		this.add(label);
		this.setSize(400,600);
		this.setLocation(200,200);
	}

}
```

Ich hoffe, du kannst dein Programm diesem hier etas angleichen, damit das dann klappt. Es wäre natürlich von Vorteil, nicht nur copy-paste zu machen und den Code auch zu studieren, dafür habe ich einige Kommentare eingefügt.

Gruss
Martin


----------



## Börger (5. Jan 2008)

Danke für eure hilfe hab das problem eben selber gefunden. Die actionPerform(MenuEvent eve) wurde nirgendwo aufgerufen!

den code daraus einfach in die actionPerformed(ActionEvent event) kopiert und schon is die sache gelaufen.

Peace der börger

und danke trotzdem an alle die mir helfen wollten


----------

