Methoden Variabeln übergeben - Eventbehandlung

  • Themenstarter Themenstarter G78073/-
  • Beginndatum Beginndatum
G

G78073/-

Gast
Hallo,

mein Problem ist, ich bekomme die Textfelder nicht aus der ersten Methode ausgelesen und nicht in der actionPerformed Methode ausgewertet.
Wie bekomme ich die eingegebenen Werte ausgelesen und kann sie verarbeiten?

Danke

Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.JFrame;
import java.awt.event.*;

public class Abbildungsgleichung implements ActionListener{
    
    public void setLayout(){
        
        JFrame f = new JFrame();
        f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f.setResizable(false);
        f.setLocation(500, 300);

        f.setLayout( new GridLayout(4, 2, 20, 5) );
        
        JLabel lable1 = new JLabel("Bildweite:");
        f.add(lable1);     
        JTextField text1 = new JTextField();
        text1.setName("b");
        text1.addActionListener(this);
        text1.getText();
        f.add(text1);

        .
        .
        .
        .
                
        JButton ok = new JButton ("Berechnen");
        ok.setName("ok");
        ok.addActionListener(this);
        f.add(ok);
        JButton lo = new JButton ("Löschen");
        lo.setName("lo");
        lo.addActionListener(this);       
        f.add(lo);
     
        f.pack();
        f.setVisible( true ); 
  
    }
    
    public void actionPerformed(ActionEvent event){

        System.out.println("Eingabe = " +  );

    }
    
    public static void main(String[] args) {
        Abbildungsgleichung ab = new Abbildungsgleichung();       
        ab.setLayout();
        
    }
    
}
 
Java:
System.out.println("Eingabe = " +  );

mit dieser Zeile Code bekommst auch keine Ausgabe, da hinter dem "+" die weitere Ausgabe fehlt. Außerdem liest du den Inhalt erst aus, wenn du text1.getText() machst UND diesen Wert entweder hinter das "+" schreibst(!) ODER wenn du es in eine Variable vom Typ String(!) speicherst. Das einfach so in den Raum zu stellen, wie du es gemacht hast, ist eine Verschwendung von Code. 🙂 Das macht einfach nichts. 🙂
 
Hi,

das war mit klar das
Java:
System.out.println("Eingabe = " +  );
so nichts bringt. Hatte es nicht gelöscht um zu zeigen das ich dort den Eingabewert anzeigen möchte.

Aber dein Kommentar hat mich noch mal insperiert!

Java:
JTextField text1
Ist nur für die erste Methode definiert daher kam ich an getText() nicht ran in der Event-Methode.
Global definiert funktioniert es.

Dank Dir und Gruß
So einfach kann es doch manch mal sein 🙂
 
Das kommt noch dazu 🙂 Variablen, die du überall im Code verwendest, mache lieber zu einer Instanzvariable. Außerdem empfehle ich dir, beim Schreiben eines eigenen Fensters, sofern du keine Vererbung durch eine andere Klasse hast, erbe die Klasse JFrame und erstelle deine GUI im Konstruktor. Auf deine Art kann man das auch machen, aber es wird anständigerweise im Konstruktor gemacht, da im Konstruktor die Klasse konstruiert wird, so halt auch die Frames =)
 
Was sind denn genau die Unterschiede zwischen einem Konstruktor und einer Methode?
Was ist der Vorteil das JFrame mit einem Konstruktor zu erzeugen gegenüber der Art wie ich es gemacht habe?
Kann mir jemand ein einfaches Beisiel posten?
Danke

Das sind die Unterschied die mir bekannt sind.
Java:
// 1. kein Modifikator wie void o.ä.
// 2. Name wie die Klasse
Konstruktor(Typ Parameter) // genau wie bei der Methode
{
  // Anweisungen wie bei der Methode und hat wenn auch einen Rückgabewert
}
 
Den Konstruktor rufst du hiermit auf
Java:
 JFrame frame = new JFrame()

Das heißt auch, dass schon bei dem einfachen Vorarbeit geleistet wird! Dadurch ersparst du dir halt einen weiteren Methodenaufruf. Außerdem ist doch dafür die "spezielle Methode" eingeführt worden. Der heißt nicht ohne Grund Konstruktor. Er konstruiert dir halt die Klasse schon vor. Nebenbei ist es die normale Vorgehensweise, das in den Konstruktor zu packen.
 
Ich kann dir nicht ganz folgen, das habe ich doch gemacht?
Java:
//Zeile 10 erster Beitrag.
JFrame f = new JFrame();
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE )
f.setResizable(false);
f.setLocation(500, 300);
 
Ich meine damit, dass das ein Konstruktoraufruf ist. Auf dein Programm bezogen würde das so aussehen:
Java:
Abbildungsgleichung a = new Abbildungsgleichung()
Damit ersparst du dir den extra-Methodenaufruf, da, wenn du es im Konstruktor machst, das schon reichen könnte um das Programm zu starten. So wird es auch normalerweise gehandhabt.
 
Also so ganz habe ich dich noch immer nicht verstanden.

1. Variante
Damit ersparst du dir den extra-Methodenaufruf
Damit hätte ich mir die Methode gespart. Wenn ich das JFrame in der main Methode aufrufe.

Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.JFrame;
import java.awt.event.*;
 
public class Abbildungsgleichung implements ActionListener{
    
    
    public void actionPerformed(ActionEvent event){
 
        
    }
    
    public static void main(String[] args) {
    
         JFrame f = new JFrame();      
    }   
}

2. Variante
da, wenn du es im Konstruktor machst,
Ich habe doch keinen Konstruktor?!
Ich müßte mir doch erst einen erstellen sieht das dann so aus?

Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.JFrame;
import java.awt.event.*;
 
public class Abbildungsgleichung implements ActionListener extends JFrame{

    public Abbildungsgleichung () {     //  mein neuer Konstruktor


    }
    
    
    public void actionPerformed(ActionEvent event){
 
        
    }
    
    public static void main(String[] args) {
    
         new Abbildungsgleichung ();      
    }   
}
 
Man programmiert in Java OOP und auf deine Weise, alles in die Main-Methode zu verlagern (deine Variante 1) wird eigentlich nicht verwendet, da du irgendwann mal Klassen schreibst, die voneinander erben und du halt auch Instanzvariablen benötigst, die nicht static sind!

Deine Variante 2 spielt genau auf das hin, was ich meine. Man baut sich seinen Konstruktor und lässt in diesen Konstruktor sich das Frame zusammensetzen. Also, alles, was du vorher gemacht hast mit Widgets hinzufügen etc, macht nun der Konstruktor. Wenn man es übersichtlich will, kann man sich mehrere Methoden basteln, die dann die Widgets erzeugen und hinzufügen und diese Methoden dann im Konstruktor aufrufen, aber im Endeffekt bastelt der Konstruktor dir dein Frame zusammen.
Das man dann die Main-Methode in die selbe Klasse schreibt wird eigentlich nicht so gehandhabt, oft wird das voneinander getrennt, der Übersichtlichkeit halber. Es ist auch möglich, wird aber eher selten so ausgeführt.
Kurzfassung: Variante 2 ist genau das, was ich meine, bis auf die Main-Methode, die man nun in eine andere Klasse auslagern kann.
 

Neue Themen


Zurück
Oben