Button Text mit Action Listener [Hilfe!]

TaCqz

Mitglied
Hallo Leute,

Ich bin relativ neu mit Java. Ich habe jetzt versucht einen Frame mit drei Buttons zu erstellen. Das hat auch geklappt. Jetzt habe ich aber zwei Fragen:

1. Wie kann ich mithilfe eines ActionListeners den Text auf dem Knopf wechseln?

2. Wie kann ich per Knopfdruck ein JPopupMenu öffnen?

Ich habe 1. schon ausprobiert, jedoch funktioniert das nicht ganz :/

Hier der Quelltext:

Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPopupMenu;
import javax.swing.plaf.basic.BasicButtonListener;


public class ProgrammStart {

JPopupMenu go;
JFrame frame;
JButton startKnopf;
JButton trolled;
	
	
	
	
	public static void main(String[] args) {
		
		ProgrammStart gui = new ProgrammStart ();
		
		gui.los();
		
	}	
		
		public void los() {
		
		JFrame menu = new JFrame("Jump it!    Hauptmenu");
		
		JButton startKnopf = new JButton("Spiel Starten");
		
		startKnopf.addActionListener(new JButtonListener());		
		
		
		JButton optionen = new JButton("Optionen");
		JButton trolled = new JButton("HAHA");
		JButton info = new JButton("Info");
		
		
		menu.setSize(600, 400);
		menu.getContentPane().add(BorderLayout.WEST, startKnopf);
		menu.getContentPane().add(BorderLayout.EAST, optionen);
		menu.getContentPane().add(BorderLayout.SOUTH, info);
		
		
		go.setSize(800, 600);
		
		
		menu.setVisible(true);

		

	}


	class JButtonListener implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			
			startKnopf.setText("HAHA");
			
			
			
			
			
			
		}
	
	
	
	
	}
}

Danke im voraus,
TaCqz
 
Ich habe das Gefühl, du kommst etwas durcheinander. Versuch immer ein Problem nach dem anderen zu lösen.

Zum Beispiel versuchst du das PopupMenu "go" zu ändern obwohl noch kein Objekt davon erzeugt wurde. Somit bekommst du natürlich den angezeigten Fehler. (NullPointerException)

Dein Ansatz zum ändern des Button Texts war ganz vernünftig, nur das du zweimal eine Variable "startknopf" initialisiert hast. Es reicht hier wenn du nur die globale äußere Variable benutzt.
 
Dann erklär mir das bitte mal 😀 Ich bin noch ein anfänger.

Ich kriege immer eine Fehlermeldung wenn ich den startknopf drücke.

Diesen hier:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at ProgrammStart$JButtonListener.actionPerformed(ProgrammStart.java:67)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
 
Zuletzt bearbeitet:
Ach ne, echt? 😉

Ich habe doch geschrieben, dass du diese Fehlermeldung bekommst und dir auch gesagt warum du diese erhältst.

Ich versuche es nochmal:

Du hast in deinem Code die Variable "go" initialisiert mit dem Typen JPopupMenu. Diese Variable ist eine Klassenvariable und somit in der kompletten Klasse verfügbar.
Java:
JPopupMenu go;

Zu diesem Zeitpunkt existiert allerdings noch kein Objekt von JPopupMenu. Ein Objekt dieser Klasse erstellt man mit
Code:
new
also
Java:
JPopupMenu go = new JPopupMenu();

Erst jetzt, nachdem das Objekt existiert kannst du die Eigenschaften des Objekts ändern.

So wie du es z.B. hier in der Methode los() gemacht hast.
Java:
go.setSize(800, 600);

[TIPP]Eine NullPointerException (kurz NPE) wird geworfen, wenn man auf ein Objekt, welches noch nicht existiert (also null ist), eine Methode aufruft um dessen Zustand zu ändern.[/TIPP]
 
Ich habe das JPopupMenu go schon lange entfernt. Trotzdem wird mir diese Fehlermeldung hingeworfen. Und zwar dann, wenn ich den Knopf drücke welcher seinen Text ändern soll.

Edit: Hat sich alles gelöst. Ich habs jetzt verstanden 😀 Danke für deine Geduld 😀
 
Zuletzt bearbeitet:
In deiner los-Methode erstellst du ein JButton-Objekt namens startKnopf und diesem fügst du den JButtonListener hinzu.
Wenn der ActionListener dann ausgelöst wird weil du auf den Button drückst, führt er den Code in der actionPerformed-
Method aus. Dort verwendest du aber die Membervariable aus deiner gesamten Klasse, die startKnopf heißt!
Diese ist aber noch nicht initialisiert!

Lösung:
entferne das JButton vor dem Variablennamen startKnopf.
dadurch verwendest du die Membervariable.

Java:
public void los() {
                JFrame menu = new JFrame("Jump it!    Hauptmenu");
                startKnopf = new JButton("Spiel Starten");
                startKnopf.addActionListener(new JButtonListener());

                ...
 
In deiner los-Methode erstellst du ein JButton-Objekt namens startKnopf und diesem fügst du den JButtonListener hinzu.
Wenn der ActionListener dann ausgelöst wird weil du auf den Button drückst, führt er den Code in der actionPerformed-
Method aus. Dort verwendest du aber die Membervariable aus deiner gesamten Klasse, die startKnopf heißt!
Diese ist aber noch nicht initialisiert!

Lösung:
entferne das JButton vor dem Variablennamen startKnopf.
dadurch verwendest du die Membervariable.

Java:
public void los() {
                JFrame menu = new JFrame("Jump it!    Hauptmenu");
                startKnopf = new JButton("Spiel Starten");
                startKnopf.addActionListener(new JButtonListener());

                ...

Geklärt! Vielen Dank 😀
 
Zuletzt bearbeitet:
Das kommt daher, dass du wahrscheinlich den gleichen Listener für beide Buttons benutzt hast. Hierbei gibt es zwei Möglichkeiten zur Abhilfe.

1. Du erstellst für jeden Button einen eigenen Listener. (also wieder eine neue eigene interne Klasse so wie du es schon einmal gemachst hast.

2. Du prüfst in deiner ActionListener Klasse welcher Button das Event ausgelöst hat. (mit If-Anweisung)
Und entsprechend musst du dann halt die Fallunterscheidung machen. getSource() oder so ähnlich soll die Methode heißen die das ActionEvent anbieten soll. (weiß es grad nicht auswendig)
 
Danke. Das habe ich aber mitlerweile gelöst 😀 Jetzt das nächste problem 😀D Der Knopf Spiel Starten öffnet jetzt einen neuen Frame. Jetzt möchte ich, das beim drücken vom knopf "Einstellungen" kein neuer Frame geöffnet wird, sondern der gleiche Frame geleert und mit neuen Inhalten gefüllt wird. Wie mach ich das dann? So hab ich das, aber dann hängt das Programm sich auf:

Java:
               class JButtonListener2 implements ActionListener {
		
			public void actionPerformed(ActionEvent event) {
				
				menu.removeAll();
				menu.add(vollbild);
				
				
				}
		}

Ich mache aber fortschritte 😀

GL TaCqz
 
Hört sich eher danach an, als wäre ein JTabbedPane das, wonach du suchst?

Im Falle des weiteren Vorgehens in diesem Fall würde ich erstmal das Menü neu initialisieren (bin mir aber nicht sicher, ob das wirklich notwendig ist) und dann mittels der add-Methode die Elemente drauf schieben, die du benötigst.

Java:
public void actionPerformed(ActionEvent event) {
  menu.removeAll();

  menu = new JFrame("Jump it!    Einstellungen");
  JButton knopf = new JButton("Sonstewas");
  knopf.addActionListener(new JButtonListener()); // Welchen Listener auch immer man hier registriert.

  menu = new JPanel();
  menu.add(knopf);

  // ...
}
 
Zuletzt bearbeitet:
Vielen Dank! Ich habe jetzt das Menu fertig. Jetzt gehts an das eigentliche Spiel! Es soll ein Jumpo & Run game werden. Hat hier einer eine Ahnung wie ich den SPieler als person, welcher sich auf einer fläche frei ´bewegen kann, programmieren kann? So wie in mirrors edge, nur nicht so schön udn ersstmal nur mit laufen?
 

Zurück
Oben