ActionListener "nach oben weitergeben"

Samarek

Aktives Mitglied
Hi,
ich hab folgendes Problem, vielleicht gehört das sogar in's Anfängerforum, also ...
momentan baue ich eine Oberfläche auf, unter anderem aus selbstgemachten JPanels auf denen verschiedene Sachen stehen, die vielleicht verändert werden sollen und auf denen es Buttons gibt.

Jetzt möchte ich gerne das z.B. einer der Buttons ein Objekt das dem, alles beinhaltenden, JFrame gehört beeinflusst, also z.B. eine Methode von diesem Objekt aufruft, ihm einen Wert übergibt oder was auch immer.

Wie bringe ich also den ActionListener der auf dem JPanel liegt mit dem Objekt zusammen dass dem JFrame gehört, so dass ich also im ActionListeners des JPanels eine Methode des Objektes vom JFrame aufrufen kann.

... und das ganze soll natürlich auch den Geist der Verkapselung zufriedenstellen, also allgemein sein, so dass ich das gleiche selbstgemachte JPanel auch auf anderen JFrames benutzen kann.
 

Andi_CH

Top Contributor
Wenn ich das Getippse richtig verstanden habe, macht man das Umgekehrt.

Mach die "obere" Komponente zum Listenener und teil am Anfang der unteren Komponente mit wer Listener ist.
(Ob das MVC ist, weiss ich wirklich nicht)

Nicht lauffähiges Codeschnipsel:
Java:
import java.awt.event.*;

public class ObereKlasse implements ActionListener {

	UntereKlasse uk;

	public ObereKlasse() {
		uk = new UntereKlasse(this);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
	}

	public static void main(String... args) {
		ObereKlasse ok = new ObereKlasse();
	}
}

Java:
import java.awt.event.ActionListener;
import javax.swing.JButton;

public class UntereKlasse {

	private final ActionListener mActionListener;
	private JButton mButton;

	public UntereKlasse (ActionListener listener) {
		mActionListener = listener;
 		mButton = new JButton();
 		mButton.addActionListener(mActionListener);
	}
}
 

njans

Top Contributor
Java:
public void actionPerformed(ActionEvent e) 
{
  // Bau dir doch einen getter um an den Frame zu kommen.
  // Dabei muss der natürich nicht ne static methode sein, sondern kann auch an einem 
  // anderen Objekt abrufbar sein ;)
  MeinFrame frame = MeinFrame.holeBestehendesExemplar();
  // Danach mach etwas damit

}
 

Samarek

Aktives Mitglied
Ja, das war beides schonmal sehr nützlich, danke dafür.

Aber jetzt kommt das ja alles in der gleichen actionPerformed an und das differenzieren der Buttons hier jetzt die Lösung sein soll kann ich mir nicht vorstellen.
Wie komme ich denn jetzt dahin dass der geklickte Button auch genau macht was er soll?
 

beastofchaos

Bekanntes Mitglied
Also ich führe dazu mal das Modell von Andi_CH weiter:

Du musst ja in der actionPerformed-Methode mit is-Else-Abfragen immer rausfinden, welche Komponente grad geklickt wurde. das sieht dann so aus:

Java:
@Override
public void actionPerformed(ActionEvent e){
    if (e.getSource() == /*Hier muss dein Button von der Unterklasse stehen*/){
        machWasDerButtonMachsenSoll();
    }
    else if(e.getSource() == /*irgendeine andere Komponente*/){
    ...
    ...
}

Wie dir sicher auffällt, haben wir aber keinen Zugriff auf den Button, da er (sehr warsch.) eine private Eigenschaft von der Unterklasse ist. Entweder machst du in dieser Unterkomponete die Eigenschaft public und nennt sie direkt in der "Action-Methode" oder du machst halt das ganze mit einem getter(was "sauberer" wäre):

Java:
public class Oberklasse implements ActionListener{
    UntereKlasse uk;
    ...
    public void actionPerformed(ActionEvent e){
        if (e.getSource() == uk.mButton){           // Hier wird direkt auf den Button zugegriffen
            machWasDerButtonMachsenSoll();
        }
        ...
    }
    ...
}

public class UntereKlasse {
 
    private final ActionListener mActionListener;
    public JButton mButton;               // private -> public
    ...

oder halt:

Java:
public class Oberklasse implements ActionListener{
    UntereKlasse uk;
    ...
    public void actionPerformed(ActionEvent e){
        if (e.getSource() == uk.getButton()){           // Hier wird über einen Getter auf den Button zugegriffen
            machWasDerButtonMachsenSoll();
        }
        ...
    }
    ...
}

public class UntereKlasse {
 
    private final ActionListener mActionListener;
    private JButton mButton;
    ...

    public JButton getButton(){
        return mButton;
    }

    ...
}

So, hab jetzt mal fast alles ausführlich erklärt (Man könnte aber noch...blablabla) :lol:

Gruß, Thomas
 

Pepe Rohny

Aktives Mitglied
Hi,
meinst du so was:
Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Test 
extends JFrame 
implements ActionListener {

    private final JButton button;
    private final JTextArea teaxtArea;

    private Test() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        button = new JButton("Bitte drücken ...");
        button.addActionListener(this);

        teaxtArea = new JTextArea(5, 20);

        setLayout(new BorderLayout());
        add(teaxtArea, BorderLayout.CENTER );
        add(button, BorderLayout.SOUTH );

        pack();
        setVisible(true);

    }

    @Override
    public void actionPerformed(ActionEvent evt) {
        if (evt.getSource() == button) {
            teaxtArea.setText("Danke!");
        }
    }

    public static void main(String[] args) {
        new Test();
    }

}
?
Pepe
 

njans

Top Contributor
Nun du kannst am einfach bei der Erstellung der Buttons einfach .setName("oeffneDasMenueX"); verwenden um den Namen des Buttons zu setzen.

Dann kannst du in der ActionPerformed einfach dir den Button holen und dann getName() ausführen und schauen, welcher Name es ist.

Dabei entweder den Namen durch if/ else if "jagen" oder in einen switch(String s) packen (ab Java 7)
 

Michael...

Top Contributor
Aber geht das nicht auch schöner ?
Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Demo {
	public Demo() {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(0, 0, 400, 200);
		frame.setLocationRelativeTo(null);
		frame.setLayout(new GridLayout(2, 1));
		Controller controller = new Controller() {
			public void machDas() {
				System.out.println("mach das");
			}

			public void machDies() {
				System.out.println("mach dies");
			}

			public void machSonstEtwas() {
				System.out.println("mach sonst etwas");
			}
		};
		frame.add(new Panel1(controller));
		frame.add(new Panel2(controller));
		frame.setVisible(true);
	}
	
	interface Controller {
		public void machDies();
		public void machDas();
		public void machSonstEtwas();
	}
	
	class Panel1 extends JPanel {
		private Controller control;
		
		public Panel1(Controller controller) {
			this.control = controller;
			this.setLayout(new GridLayout(1, 1));
			JButton button = new JButton("Dies");
			this.add(button);
			button.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					control.machDies();
				}
			});
		}
	}
	
	class Panel2 extends JPanel {
		private Controller control;
		
		public Panel2(Controller controller) {
			this.control = controller;
			this.setLayout(new GridLayout(1, 2));
			JButton button = new JButton("Das");
			this.add(button);
			button.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					control.machDas();
				}
			});
			button = new JButton("SonstEtwas");
			this.add(button);
			button.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					control.machSonstEtwas();
				}
			});
		}
	}
	
	public static void main(String[] s) {
		new Demo();
	}
}
 

beastofchaos

Bekanntes Mitglied
"
Java:
button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    control.machDies();
                }
            });
"

Das wollte ich auch gerade vorschlagen. entweder du machst so eine "temporäre" direkt definierte Klasse oder du machst noch eine eigene weiter darunter, die alles abhandelt ("addActionListener(new MyCustomActionListener());"
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
T Denkblockade -> wie gehts nach dem ActionListener weiter AWT, Swing, JavaFX & SWT 13
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
L actionListener für Button AWT, Swing, JavaFX & SWT 97
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
R ActionListener in Actionlistener AWT, Swing, JavaFX & SWT 6
S Swing Variable in Actionlistener aufrufen AWT, Swing, JavaFX & SWT 10
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
Blender3D einzelner ActionListener vs anonyme ActionListener AWT, Swing, JavaFX & SWT 10
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
J ActionListener bei Buttons AWT, Swing, JavaFX & SWT 14
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z ActionListener Variable übergeben AWT, Swing, JavaFX & SWT 12
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
S While Schleife im Actionlistener AWT, Swing, JavaFX & SWT 1
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
Liondary GUI - ActionListener AWT, Swing, JavaFX & SWT 7
J ActionListener erkennt Variable nicht AWT, Swing, JavaFX & SWT 6
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
Sin137 ActionListener in MVC AWT, Swing, JavaFX & SWT 7
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 ActionListener Variablen AWT, Swing, JavaFX & SWT 13
Y ActionListener AWT, Swing, JavaFX & SWT 2
K Ereignisbehandlung, ActionListener, ActionEvent AWT, Swing, JavaFX & SWT 3
A Gui für Vokabeltrainer (ActionListener) AWT, Swing, JavaFX & SWT 14
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
R Swing Problem: IOException bei ActionListener AWT, Swing, JavaFX & SWT 1
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
T Einfaches Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
K GUI, Button, ActionListener - ein paar Einsteigerprobleme AWT, Swing, JavaFX & SWT 1
W Verschachtelter ActionListener AWT, Swing, JavaFX & SWT 0
N gewünschte ActionListener bei RadioButton mit isSelected geht nicht AWT, Swing, JavaFX & SWT 2
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
A Swing ActionListener AWT, Swing, JavaFX & SWT 8
V ActionListener Abhängigkeitenproblem AWT, Swing, JavaFX & SWT 6
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
J ActionListener für Buttons AWT, Swing, JavaFX & SWT 3
M Event Handling ActionListener übergeben ich checks net AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
S Button (ActionListener) funktioniert nicht, wenn y-Koordinate verändert wird AWT, Swing, JavaFX & SWT 5
L Swing ActionListener führt seine Aufgabe nur teilweise aus. AWT, Swing, JavaFX & SWT 7
A Swing ActionListener kann nicht hinzugefügt werden AWT, Swing, JavaFX & SWT 4
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
M ProgressBar in ActionListener AWT, Swing, JavaFX & SWT 4
D AWT eigenem Knopf ActionListener zuweisen AWT, Swing, JavaFX & SWT 24
E Wert aus ActionListener geben AWT, Swing, JavaFX & SWT 4
J ActionListener per Innere Klasse oder e.getActionCommand() if-Abfrage? AWT, Swing, JavaFX & SWT 12
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
P Swing Seltsames ActionListener-Verhalten AWT, Swing, JavaFX & SWT 7
Oliver530 ActionListener von eigener ButtonKlasse AWT, Swing, JavaFX & SWT 16
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 2
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 3
C In der Schleife ActionListener aktivieren AWT, Swing, JavaFX & SWT 3
B Swing Problem beim ActionListener AWT, Swing, JavaFX & SWT 5
P Swing JPanel mit ActionListener mehrfach verwenden AWT, Swing, JavaFX & SWT 8
1 ActionEvent generieren und an ActionListener weiterleiten AWT, Swing, JavaFX & SWT 12
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
N JCombobox und Actionlistener Aktion nur ausführen, wenn Useraktion ihn auslöst AWT, Swing, JavaFX & SWT 4
N Componente und Actionlistener AWT, Swing, JavaFX & SWT 5
C ActionListener AWT, Swing, JavaFX & SWT 6
Corben ActionListener Error AWT, Swing, JavaFX & SWT 2
F Wert durch ActionListener an Klasse übergeben AWT, Swing, JavaFX & SWT 3
I Swing Problem mit InputMap bei JButton (ActionListener) AWT, Swing, JavaFX & SWT 3
S Swing JButton mit ActionListener innerhalb einer JTable AWT, Swing, JavaFX & SWT 4
P Variablen in einem ActionListener zurücksetzen AWT, Swing, JavaFX & SWT 6
M AWT Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
A Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht AWT, Swing, JavaFX & SWT 5
M Anonymer ActionListener AWT, Swing, JavaFX & SWT 4
L SWT Actionlistener Combobox öffnen AWT, Swing, JavaFX & SWT 4
S MenuBar ActionListener Event ... AWT, Swing, JavaFX & SWT 6
B Swing Formular mit mehreren Elementen - wie die ActionListener-Verarbeitung lösen? AWT, Swing, JavaFX & SWT 2
M getSource() findet Button nicht - ActionListener AWT, Swing, JavaFX & SWT 4
S Swing mit ActionListener auf Objekte einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben