ActionListener mit KeyListener

KingOnline1

Mitglied
Hallo zusammen,

ich bin neu hier und hab auch gleich eine Frage. Ich hab zwar schon gesucht, aber nichts passendes gefunden.

Ich möchte einen Taschenrechner programmieren, bzw. hab ich schon und der Funktioniert auch recht gut. Nur Standardrechenarten nichts besonderes. Das halt um ein wenig mit GUI warm zu werden.

Die Buttons hören auf den Mauszeigen alle gut, nur möchte ich die auch mit der Tastatur aktivieren können. Ich habe dazu eine Klasse, die ActionListener implementiert hat. Da steht eine menge code, der auch funktioniert. Jetzt hab ich mir überlegt eine neue Klasse mit KeyListener zu implementieren, die auf den Code im ActionListener zugreifen kann.

Ich hoffe ihr versteht was ich meine. Ich möchte keinen redundanten Code produzieren.

Ich habe an sowas gedacht wie:

Java:
private class KeyHandler implements KeyListener
public void keyTyped(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_1)){
// hier auf den Code vom ActionListener zugreifen 
} 
}
:bahnhof:


Danke schonmal für eure Hilfe.
 

Lodoss

Aktives Mitglied
Möglichkeit 1:

Beide Listener rufen eine in der Klasse befindliche Methode auf

Java:
methodeX()
{
    JButton btn = new JButton("Button 1");
		
    btn.addActionListener(new ActionListener()
    {
	public void actionPerformed(ActionEvent arg0)
	{
		eineMethode();
	}
    });
		
    this.addKeyListener(new KeyAdapter()
    {
	public void keyTyped(KeyEvent e)
	{
                // wenn "1" gedrückt wird
	        if (e.getKeyCode() == KeyEvent.VK_1)
		{
			eineMethode();
		}
	}
    });
}

private eineMethode()
{
    // ....
}
 
Zuletzt bearbeitet:

KingOnline1

Mitglied
Ich glaube, dass das so nicht funktionieren wird.
In meiner Methode habe ich if-Verzweigungen für jeden Button.
Der Methode im ActionListener wird ja eine ActionEvent e übergeben.
Beim KeyListener ist es ja ein KeyEvent.

Wenn ich jetzt die Methode separat schreibe und dann versuche im ActionEvent aufzurufen, geht das, aber mit dem KeyEvent ja nicht.

Das mit dem KeyAdapter habe ich auch nicht ganz verstanden.

Ich werde mal einen Teil vom Code hier reinschreiben:

Java:
public class Calculator extends JFrame {
	private JButton buttonOne;

	public Calculator() {
		buttonOne = new JButton("1");
		buttonOne.addActionListener(new NumberButtonHandler());
		numberPanel.add(buttonOne);
	}

	private class NumberButtonHandler implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			if (e.getSource() == buttonOne) {
				displayTextArea.setText(displayTextArea.getText() + "1");
				if (!additionCounter && !substractionCounter
						&& !multiplyCounter && !divisionCounter)
					operationButtonEnabler(true);
				else {
					operationSingleButtonEnabler();
					buttonNegative.setEnabled(true);
                                }
                        } else if (...) {
                                ...
                        }
                }
        }

	private class KeyHandler implements KeyListener {

		@Override
		public void keyPressed(KeyEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void keyReleased(KeyEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void keyTyped(KeyEvent e) {
			
		}
	}

Die geschweiften Klammern beim NumberButtonHandler stimmen hier nicht ganz glaub. Sieht so komisch eingerückt aus. Das ist aber bei mir auf dem Rechner aller in Ordnung.

Ich hoffe, dass der Ausschnitt mal reicht. Ist jetzt natürlich nur das Beispiel für den einen Button. Natürlich steht da noch viel mehr. Ich bin auch noch ein Anfänger.

Ich habe jetzt auch mal probiert die Methoden auch im KeyListener zu implementieren, die ich im ActinListener implementiert hab. Nachdem ich den KeyListener dem Button 1 hinzugefügt habe, hat es aber auch nicht geklappt.

Ich steh brutal auf'm Schlauch.
 

Lodoss

Aktives Mitglied
so kannst du die beiden listener auf den button packen
Java:
        buttonOne = new JButton("1");
        buttonOne.addActionListener(new NumberButtonHandler());
        buttonOne.addKeyListener(new KeyHandler());

du nimmst den sourcecode der im NumberbuttonHandler drinsteht und lagerst den in den Calculator in eine eigene methode aus ("inputPerformed(char value)"). die beiden listener übernehmen nurnoch die aufgabe, jenachdem welcher knopf gedrückt wurde oder welcher key auf der tastatur gedrückt wurde entsprechend die inputPerformed mit dem richtigen Wert aufzurufen.
Java:
    private class NumberButtonHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            if (e.getSource() == buttonOne)
            {
            	inputPerformed('1');
            }
        }
    }
gleiches spielchen im KeyHandler
Java:
    private class KeyHandler implements KeyListener
    {
        public void keyPressed(KeyEvent e)
        {
        	inputPerformed(e.getKeyChar());
        }
 
        public void keyReleased(KeyEvent e)
        {}
 
        public void keyTyped(KeyEvent e)
        {}
    }
und hier die methode die von beiden listenern aufgerufen wird (methode von Calculator)
Java:
    private void inputPerformed(char input)
    {
    	// hier kannst du hinpacken was je nach aktion passoeren soll
    	/*
        displayTextArea.setText(displayTextArea.getText() + "1");
        if (!additionCounter && !substractionCounter
                && !multiplyCounter && !divisionCounter)
            operationButtonEnabler(true);
        else {
            operationSingleButtonEnabler();
            buttonNegative.setEnabled(true);
                        }
                } else if (...) {
                        ...
                }
        }
        */
    }

zum thema KeyAdapter: damit man nicht immer alle 3 methoden vom Keylistener implementierern muss (brauchst idr. ja nur eine) gibt es eine Klasse KeyAdapter die das übernimmt (dient nur der übersichtlichkeit) Siehe auch KeyAdapter (Java Platform SE 7 )
 
Zuletzt bearbeitet:

KingOnline1

Mitglied
Danke nochmal. Dein Tipp war sehr gut. Leider verstehe ich nicht, warum der KeyListener nicht funktioniert.

Ich habe es genauso umgesetzt, wie du es gemeint hast.
- Methode ausgelagert mit inputPerformed(Char input)
- if-Verzeigungen angepasst
- NumberButtonHandler angepasst
- KeyHandler angepasst
- button?.addKeyListener(new KeyHandler()); ergänzt

Ich hab auch ein System.out.println("1") als test probiert. Aber da reagiert nichts.
Ich habe den Code jetzt auch schon hoch und runter gelesen.
Wahrscheinlich, war DAS vorhin auch das Problem.
 
Zuletzt bearbeitet:

KingOnline1

Mitglied
Danke nochmal für deine Hilfe. Das letzte war des Rätsels Lösung. Ich habe zwar eine Weile gebraucht, bis ich es hinbekommen habe, aber es klappt jetzt schonmal für die Zahl eins. Jetzt noch für die anderen Zahlen und die Operatoren, dann dürft nichts schief gehen.

Ich habe vorhin noch zufällig herausgefunden, dass es auch davor schon geklappt hat mit dem KeyListener (also ohne die InputMap/ActionMap Sache). Das aber nur, wenn der Focus auch auf dem jeweiligen Panel ist. Ich habe da zwar auch noch kurz nachgeforscht und bin auf requestFocus() und weitere Methoden gestoßen, die aber alle nicht funktioniert haben.

Wie gesagt: mit InputMap/ActionMap klappt es jetzt.

:applaus::toll::D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Gentle KeyListener + ActionListener + AdjustmentListener -> Prob AWT, Swing, JavaFX & SWT 8
J ActionListener via KeyListener aufrufen AWT, Swing, JavaFX & SWT 2
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
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
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 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
S ActionListener "nach oben weitergeben" AWT, Swing, JavaFX & SWT 10
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

Ähnliche Java Themen

Neue Themen


Oben