Bei JFrame Menü Text anders ausführen

teamfake

Mitglied
Hallo zusammen,
ich bin noch einigermaßener Anfänger in Java und bin im Moment an den JFrames gelandet. Hierbei bearbeite ich zunächst die Menüs, was auch super geglückt ist, jedoch habe ich noch Probleme mit der Wiedergabe von Texten / Anwendungen, wenn jemand auf einen Menübutton drückt. In meinem Buch steht etwas von ActionListener, jedoch verstehe ich das noch nicht ganz, weil das bei mir immer zu einem Fehler führt :(

Hier ist mal noch der Code zum besseren Verständniss:
Code:
package NeuesZeugs;

import javax.swing.*;

public class JFrame1 {
	
	public static void main (String[] args) {
		JFrame f = new JFrame("Neues JFrame");
		
		JMenu Zeugs = new JMenu("Zeugs");
		JMenu newMenu = new JMenu("Neu");
		JMenuItem openmenu = new JMenuItem ("Öffnen");
		JMenuItem copymenu = new JMenuItem ("Kopieren");
		JMenuItem cutmenu = new JMenuItem ("Ausschneiden");
		JMenuItem pastemenu = new JMenuItem ("Ausschneiden");
		JMenuItem closemenu = new JMenuItem("Schließen");
		
		JMenuItem newProject = new JMenuItem("Neues Projekt");
		JMenuItem newSite = new JMenuItem("Neue Seite");
		JMenuItem newWorkspace = new JMenuItem ("Neuen Arbeitsplatz anlegen");
		
	    JMenuBar menuBar = new JMenuBar();
	    
	    newMenu.add( newProject );
	    newMenu.add( newSite );
	    newMenu.add( newWorkspace );
	    
	    Zeugs.add( newMenu );
	    Zeugs.add( openmenu );
	    Zeugs.add( cutmenu );
	    Zeugs.add( pastemenu );
	    Zeugs.add( closemenu );
	    
	    menuBar.add( Zeugs );
	    
	    f.setJMenuBar(menuBar);	    
		f.setJMenuBar( menuBar );
		f.setVisible( true );
		f.setSize(250,250);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


		
	}
	
}

Vielen Dank für eure Hilfe :)

Mit freundlichen Grüßen,
TF

PS: unthematische Kritik immer erwünscht :)
 
Hallo,

dein Buch hat recht :)

Also du musst an deine MenuItems ActionListener adden.
Das sieht dann beispielhaft so aus:


Java:
package NeuesZeugs;

import javax.swing.*;

public class JFrame1 {
	
	public static void main (String[] args) {
		JFrame f = new JFrame("Neues JFrame");
		
		JMenu Zeugs = new JMenu("Zeugs");
		JMenu newMenu = new JMenu("Neu");
		JMenuItem openmenu = new JMenuItem ("Öffnen");
        openmenu.addActionListener(new ActionListener()  {
           actionPerformed (ActionEvent event) {
              System.out.println("oeffnen");
            }
        });
		JMenuItem copymenu = new JMenuItem ("Kopieren");
		JMenuItem cutmenu = new JMenuItem ("Ausschneiden");
		JMenuItem pastemenu = new JMenuItem ("Ausschneiden");
		JMenuItem closemenu = new JMenuItem("Schließen");
		
		JMenuItem newProject = new JMenuItem("Neues Projekt");
		JMenuItem newSite = new JMenuItem("Neue Seite");
		JMenuItem newWorkspace = new JMenuItem ("Neuen Arbeitsplatz anlegen");
		
	    JMenuBar menuBar = new JMenuBar();
	    
	    newMenu.add( newProject );
	    newMenu.add( newSite );
	    newMenu.add( newWorkspace );
	    
	    Zeugs.add( newMenu );
	    Zeugs.add( openmenu );
	    Zeugs.add( cutmenu );
	    Zeugs.add( pastemenu );
	    Zeugs.add( closemenu );
	    
	    menuBar.add( Zeugs );
	    
	    f.setJMenuBar(menuBar);	    
		f.setJMenuBar( menuBar );
		f.setVisible( true );
		f.setSize(250,250);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


		
	}
	
}

Jetzt wird auf deiner Konsole "oeffnen" ausgegeben, wenn du auf den Menüeintrag öffnen klickst.
Achtung ich hab es nicht getestet!!
Kann sein , dass ich mich vertippt habe!!
 
Zuletzt bearbeitet von einem Moderator:
Du solltest deine Struktur des Programms etwas ändern. Es ist sehr unschön alles in die main zu packen.
Wenn du das ganze nur als Test siehst ist das sicher ok, solltest du aber irgendwann eine größere Anwendung planen, solltest du objektorientiert arbeiten.

Beispiel:


1.Klasse Programm1
Java:
package Programm;

import javax.swing.*;

public class Programm1 {

   Gui gui;

   public static void main (String[] args) {
      gui = new Gui("Neues JFrame");
   }

}

2. Klasse Gui
Java:
package Programm;

import javax.swing.*;

public class Gui extends JFrame {


   public Gui (String frameName) {
      super();

      this.setTitle(frameName);
      this.setSize(250,250);
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
      JMenu zeugs = new JMenu("Zeugs");
      JMenu newMenu = new JMenu("Neu");
      JMenuItem openmenu = new JMenuItem ("Öffnen");
      JMenuItem copymenu = new JMenuItem ("Kopieren");
      openmenu.addActionListener(new ActionListener()  {
          actionPerformed (ActionEvent event) {
              System.out.println("oeffnen");            
           }       
        });
      JMenuItem cutmenu = new JMenuItem ("Ausschneiden");
      JMenuItem pastemenu = new JMenuItem ("Ausschneiden");
      JMenuItem closemenu = new JMenuItem("Schließen");
	
       JMenuItem newProject = new JMenuItem("Neues Projekt");
       JMenuItem newSite = new JMenuItem("Neue Seite");
       JMenuItem newWorkspace = new JMenuItem ("Neuen Arbeitsplatz anlegen");

       JMenuBar menuBar = new JMenuBar();
      
        newMenu.add( newProject );
        newMenu.add( newSite );
        newMenu.add( newWorkspace );
	    
        zeugs.add( newMenu );
        zeugs.add( openmenu );
        zeugs.add( cutmenu );
        zeugs.add( pastemenu );
        zeugs.add( closemenu );
	  
        menuBar.add( zeugs );

          this.setJMenuBar(menuBar);	    
          this.setJMenuBar( menuBar );

          this.setVisible( true );


   }
}

Achtung auch nicht getestet.
Kann sein, dass ich mich vertippt habe. Kann gerade nicht testen. Ist nur so aus dem Kopf geschrieben.
 
Zuletzt bearbeitet von einem Moderator:
Hallo zusammen,
erstmal vielen Dank für euren schnellen Antworten :)

@FrankBooth: Vielen Dank erstmal für deine Mühe :) Ich habe aber leider nun weitere Fragen, einige wegen dem Code, einige Grundlegende.

als erstes zum Code:
Dieser funktioniert leider nicht, da wird bei mir in Eclipse das "ActionListener() " immer rot unterstrichen -> Fehler. Das ist auch in etwa das gleiche Problem, was ich mit dem Code aus meinem Buch hatte. Deswegen hier mal der wichtige Teil: ( das ganze über den Mainteil zu packen habe ich jetzt noch nicht berücksichtigt ):

Code:
package NeuesZeugs;

import javax.swing.*;

public class JFrame1 {
	public static void main (String[] args) {
		JFrame f = new JFrame("Neues JFrame");
		
		JMenu Zeugs = new JMenu("Zeugs");
		JMenu newMenu = new JMenu("Neu");
		JMenuItem openmenu = new JMenuItem ("Öffnen");
		openmenu.addActionListener(new ActionListener()  {
	          actionPerformed (ActionEvent event) {
	              System.out.println("oeffnen");            
	           }      
	        });

So, nun zu Nummer zwei :p . In meinem Buch steht immer MyFrame....MyFrame etc. aber ich weiß leider nicht, was der Unterschied zwischen einem MyFrame und einem JFrame bzw. Frame ist. Ist das einfach ein eigens definierter Name?

Code:
MyFrame m_Frame = new MyFrame ( " Menü-Testprogramm" );
Label M_lLabel = new Label( "Nichts passiert" );

public void init() 
{
m_Frame.add( m_lLabel  );

MyListener Listener = new MyListener();
...
file.add ( "Öffnen" );
file.addActionListener ( Listener );
....

Das ist der Code aus dem Buch ( Fehler können vorhanden sein, weil nur abgeschrieben ). Ist da ein Unterschied oder wie kann man das in ein JFrame umwandeln?

Vielen Dank!!

Grüße
 
So, nun zu Nummer zwei :p . In meinem Buch steht immer MyFrame....MyFrame etc. aber ich weiß leider nicht, was der Unterschied zwischen einem MyFrame und einem JFrame bzw. Frame ist. Ist das einfach ein eigens definierter Name?

MyFrame ist eine eigenen Klasse so wie in meinem Beispiel "GUI". Ersetz GUI durch MyFrame in meinem Beispiel und du hast es.

Du musst die Klasse ActionListener in dem Beispiel importieren.

In deinem Beispiel fehlt auf jeden Fall:

Java:
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
 
Zuletzt bearbeitet:
Code:
MyFrame m_Frame = new MyFrame ( " Menü-Testprogramm" );
Label M_lLabel = new Label( "Nichts passiert" );

public void init() 
{
m_Frame.add( m_lLabel  );

MyListener Listener = new MyListener();
...
file.add ( "Öffnen" );
file.addActionListener ( Listener );
....

Das ist der Code aus dem Buch ( Fehler können vorhanden sein, weil nur abgeschrieben ). Ist da ein Unterschied oder wie kann man das in ein JFrame umwandeln?

Wenn du das Beispiel benutzen willst musst du eine Klasse MyListener, MyFrame und Label implementieren.

FEHLER IN MEINEM CODE

Java:
openmenu.addActionListener(new ActionListener()  {
   public void actionPerformed (ActionEvent event) {
        System.out.println("oeffnen");
   }               
});
SO MUSS ES SEIN!
 
Zuletzt bearbeitet:
Hallo,
das habe ich mir auch schon gedacht, jedoch wird dann wie ganze Zeile
Code:
new ActionListener()  {
	          actionPerformed (ActionEvent event) {
rot unterstrichen :(

Beim Ausführen kommt folgender Fehler :
Code:
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	The type new ActionListener(){} must implement the inherited abstract method ActionListener.actionPerformed(ActionEvent)
	Return type for the method is missing
	ActionEvent cannot be resolved to a type

	at NeuesZeugs.JFrame1.main(JFrame1.java:13)

Zur Kontrolle nun nochmals der verwendete Codeteil:
Code:
package NeuesZeugs;

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

public class JFrame1 {
	public static void main (String[] args) {
		JFrame f = new JFrame("Neues JFrame");
		
		JMenu Zeugs = new JMenu("Zeugs");
		JMenu newMenu = new JMenu("Neu");
		JMenuItem openmenu = new JMenuItem ("Öffnen");
		openmenu.addActionListener(new ActionListener()  {
	          actionPerformed (ActionEvent event) {
	              System.out.println("oeffnen");            
	           }      
	        });
....

Vielen Dank ! :)

Grüße
 
Code:
package NeuesZeugs;

import javax.swing.*;
import java.awt.event.ActionEvent
import java.awt.event.ActionListener;

public class JFrame1 {
	public static void main (String[] args) {
		JFrame f = new JFrame("Neues JFrame");
		
		JMenu Zeugs = new JMenu("Zeugs");
		JMenu newMenu = new JMenu("Neu");
		JMenuItem openmenu = new JMenuItem ("Öffnen");
		openmenu.addActionListener(new ActionListener()  {
	          public void actionPerformed (ActionEvent event) {
	              System.out.println("oeffnen");            
	           }      
	        });
....
Versuch das hatte oben das public void vergesssen!
 
Zuletzt bearbeitet:
Zurück