[Java] Wie kann ich von ActionListener-Klasse auf meine Swing-Elemente zugreifen?

sim

Admiral Special
Mitglied seit
29.03.2002
Beiträge
1.900
Renomée
15
Standort
Tübingen
Hallo,
wir sollen im aktuellen Info-Übungsblatt einen simplen Taschenrechner in Java programmieren, also mit Swing und nur +, - ,
Ich kriege das auch soweit hin, finde zwar diesen ActionListener-Kram nicht so spannend; aber mein PRoblem derzeit ist, wie ich von der Klasse MyActionListener aus auf die Textfelder in meinem JFrame zugreifen kann.
Unten angegebener Code, den ich probiert habe, bringt zwar keine Fehler, aber verändert auch nix am Textfeld *noahnung*
Wär super wenn mir jemand nen Hinweis in die richtige Richtung zur Lösung des Problems geben könnte ;)

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

public class TaschenRechner extends JPanel {
  JFrame frame;

  public TaschenRechner() {
    //TaschenRechner taschenrechner = new TaschenRechner();

    /*public void actionPerformed(ActionEvent e) {
      if(tf_operator.getText() == "+") {
        tf_ergebnis.setText(tf_op1.getText() + tf_op2.getText());
      }
    }  */

    //YOUR CODE HERE
    frame = new JFrame("TaschenRechner");
    JLabel label_op1 = new JLabel("Operand");
    JLabel label_operator = new JLabel("Operator");
    JLabel label_op2 = new JLabel("Operand");
    JButton enter = new JButton("Enter");
    JTextField tf_op1 = new JTextField();
    JTextField tf_op2 = new JTextField();
    JLabel label_ergebnis = new JLabel("Ergebnis:");
    JTextField tf_operator = new JTextField();
    JTextField tf_ergebnis = new JTextField();


    enter.addActionListener(new MyActionListener());

    //ActionListener actionPerformed = new MyActionListener();



    frame.getContentPane().setLayout(new GridLayout(3,3));
    frame.setSize(200, 75);
    frame.getContentPane().add(label_op1);
    frame.getContentPane().add(label_operator);
    frame.getContentPane().add(label_op2);
    frame.getContentPane().add(tf_op1);
    frame.getContentPane().add(tf_operator);
    frame.getContentPane().add(tf_op2);
    frame.getContentPane().add(label_ergebnis);
    frame.getContentPane().add(tf_ergebnis);
    frame.getContentPane().add(enter);
    frame.setVisible(true);
  }
  
  
  public static void main(String[] args) {
    TaschenRechner taschenrechner = new TaschenRechner();
    taschenrechner.frame.setVisible(true);
  }

  class MyActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
          JTextField temp = (JTextField)frame.getContentPane().getComponent(8);

          //if(temp.getText().equals("+")) {
            JTextField temp2 = (JTextField)frame.getContentPane().getComponent(5);
            JTextField temp3 = (JTextField)frame.getContentPane().getComponent(6);
            JTextField temp4 = (JTextField)frame.getContentPane().getComponent(9);
            int ergebnis = Integer.parseInt(temp2.getText()) + Integer.parseInt(temp3.getText());
            //temp4.setText(Integer.toString(ergebnis));
            temp4.setText("test");
          //}
        }
  }
}

Mfg

sim
 
Hallo Sim,

um dein Problem zulösen, mußt du dir einen eigenen ActionListener schreiben, dem du eine Referenz auf dein TaschenRechner-Objekt übergibst. Mit Hilfe dieser Referenz kannst du aus dem ActionListener heraus mit den Variablen und den Methoden deiner TaschenRechner-Klasse arbeiten. (siehe Code)

Ich habe deinen Code mal ein wenig besser strukuriert, hoffe das dies der Lesbarkeit hilft.
Code:
import javax.swing.*;
import javax.swing.text.BadLocationException;
import java.awt.*;
import java.awt.event.*;

public class TaschenRechner extends JPanel {
[INDENT]JFrame frame = new JFrame("TaschenRechner");
JLabel label_op1 = new JLabel("Operand");
JLabel label_operator = new JLabel("Operator");
JLabel label_op2 = new JLabel("Operand");
JButton enter = new JButton("Enter");
JTextField tf_op1 = new JTextField();
JTextField tf_op2 = new JTextField();
JLabel label_ergebnis = new JLabel("Ergebnis:");
JTextField tf_operator = new JTextField();
JTextField tf_ergebnis = new JTextField();

public TaschenRechner() {
[INDENT]this.init();[/INDENT]
}
  
public void init(){
[INDENT]frame.getContentPane().setLayout(new GridLayout(3,3));
frame.setSize(200, 75);
frame.getContentPane().add(label_op1);
frame.getContentPane().add(label_operator);
frame.getContentPane().add(label_op2);
frame.getContentPane().add(tf_op1);
frame.getContentPane().add(tf_operator);
frame.getContentPane().add(tf_op2);
frame.getContentPane().add(label_ergebnis);
frame.getContentPane().add(tf_ergebnis);
frame.getContentPane().add(enter);
frame.setVisible(true);
        
enter.addActionListener(new MyActionListener(this));
[/INDENT]    
}
  
public void rechne(){[INDENT]int x = Integer.parseInt(tf_op1.getText());
int y = Integer.parseInt(tf_op2.getText());
String ergebnis = null;
String operator = null;
try {
[INDENT]operator = tf_operator.getText(0,1);[/INDENT]
} catch (BadLocationException e) {
[INDENT]e.printStackTrace();[/INDENT]
}
if (operator.equals("+")){
[INDENT]int erg = x + y;
ergebnis = "" + erg;    //Konvertiere int in String[/INDENT]
} else {
[INDENT]if (operator.equals("-")){
[INDENT]int erg = x - y;
ergebnis = "" + erg;    //Konvertiere int in String[/INDENT]
} else {
[INDENT]ergebnis = "Fehler";[/INDENT]
}[/INDENT]
}
tf_ergebnis.setText(ergebnis);[/INDENT]
}
  
public static void main(String[] args) {
[INDENT]TaschenRechner taschenrechner = new TaschenRechner();
taschenrechner.frame.setVisible(true);[/INDENT]
}
    
/**
* Dies ist mein eigener Action Listener, dem ich eine Referenz auf mein Objekt TaschenRechner
* übergeben habe, damit er mit den dortigen Funktionen arbeiten kann.
*/
public class MyActionListener implements ActionListener{
[INDENT]TaschenRechner taschenrechner;
        
public MyActionListener(TaschenRechner tr){
[INDENT]this.taschenrechner = tr;[/INDENT]
}
      
public void actionPerformed(ActionEvent arg0) {
[INDENT]taschenrechner.rechne();[/INDENT]
}[/INDENT]
}[/INDENT]}
Hoffe ich konnte dir helfen.
 
Zuletzt bearbeitet:
Ach ja, hätte da auch mal eine Frage. Wie hast du es in deinem Posting hinbekommen den Code in einem eigenen Fenster mit Srcollbar zu schreiben. Das spart ja ordentlich Platz.
 
Hi Gandhi,
dieses scrollbare Teil habe ich einfach mithilfe des Rautezeichens in dem "Gestaltungs-Menü" für Beiträge, die man schreibt, bekommen. Eventuell musst du irgendwas à la "erweiterte Funktionen" oder sowas einstellen :)
Die Tags dazu heißen einfach [ code]--hier dein Code--[ /code] ohne Leerzeichen :)

Nun zu dem eigentlichen Problem:
Ich verstehe deinen Code eigentlich komplett bis auf den elementaren Teil, nämlich deine MyActionListener-Klasse. Im Konstruktor instanziierst (schreibt man das so?) du ja ein Objekt der übergeordneten Klasse, also vom Typ ActionListener.
...
Lol war gerade Mittagessen, und jetzt beim nochmaligen Durchlesen vom Code hats auf einmal geschaltet ;)
Das Übergeben einer Referenz auf des TaschenRechner-Objekt ist echt des Puzzleteil, wo mir gefehlt hat :)
Also, vielen Dank für die ausführlichen super Tipps! *great*

sim
 
Schön, das ich dir helfen konnte, ich habe aber leider einen kleinen Fehler gemacht.

Der aufruf von: "super()" im Konstruktor von MyActionListener macht keinen Sinn und kann weggelassen werden. Die Klasse MyActionListener erweitert nämlich keine andere Klasse sondern implementiert nur eine Schnittstelle.

Soll heisen: "super()" macht nichts, braucht man also nicht.
 
Zuletzt bearbeitet:
Zurück
Oben Unten