JAVA Swing Eventlistener

Hi,
ich bin Java Anfänger und muss ein kleines Programm mit JAVA Swing schreiben.
Mein Problem hierbei (denke ich zumindest 😉) ist der Listener...
Ich habe in meinem Frame eine Variable definiert ("savelocation"):
Java:
public SimpleFrame(Document doc)  // Konstruktor
	{   		
			String savelocation = "C:\\Documents and Settings\\e914\\Desktop\\Testfiles\\";
		 	System.out.println("Speicherpfad alt: "+ savelocation);
Diese Variable beschreibt den aktuellen Speicherort einer Datei.
Aktiviere ich nun in meinem Menü den button "Change" soll das Programm den vorgegeben Speicherpfad durch einen neuen ersetzten.
Java:
MenuItem Change = new MenuItem("Ändern");
	    SP.add(Change);
	    
	    //Listener
	    	Change.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
            	 ChangeButtonActionPerformed(evt);
            }
        });
Funktion :
Java:
    private String ChangeButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {
    String savelocation = "C:\\";
    return savelocation;  
    }

Mein Problem ist jetzt, dass ich es nicht hin bekomme, dass nach dem aktivieren des "Change" buttons der neue Pfad in meiner Funktion an meinen Frame übermittelt und der alte Wert dauerhaft überschrieben wird.

Ich hoffe ich konnte alles ganz gut erklären 😀
Danke für eure Hilfe!
 
Hi,
ich bin Java Anfänger und muss ein kleines Programm mit JAVA Swing schreiben.
Mein Problem hierbei (denke ich zumindest 😉) ist der Listener...
Ich habe in meinem Frame eine Variable definiert ("savelocation"):
Java:
public SimpleFrame(Document doc)  // Konstruktor
	{   		
			String savelocation = "C:\\Documents and Settings\\e914\\Desktop\\Testfiles\\";
		 	System.out.println("Speicherpfad alt: "+ savelocation);
Diese Variable beschreibt den aktuellen Speicherort einer Datei.
Aktiviere ich nun in meinem Menü den button "Change" soll das Programm den vorgegeben Speicherpfad durch einen neuen ersetzten.
Java:
MenuItem Change = new MenuItem("Ändern");
	    SP.add(Change);
	    
	    //Listener
	    	Change.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
            	 ChangeButtonActionPerformed(evt);
            }
        });
Funktion :
Java:
    private String ChangeButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {
    String savelocation = "C:\\";
    return savelocation;  
    }

Mein Problem ist jetzt, dass ich es nicht hin bekomme, dass nach dem aktivieren des "Change" buttons der neue Pfad in meiner Funktion an meinen Frame übermittelt und der alte Wert dauerhaft überschrieben wird.

1. Man schreibt Variablen immer klein! Es heißt also nicht "Change", sondern "change"! Genauso dein "SP"!
2. Wieso returnst du in der ChangeButtonActionPerformed-Methode einen String, wenn du diesen String nirgends abspeicherst?

Wenn du es funktionierend haben willst, dann mach es so:
Java:
    private void ChangeButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {
    savelocation = "C:\\";
    }
oder
Java:
    Change.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
            	savelocation = ChangeButtonActionPerformed(evt);
            }

Ist aus deinem Code entnommen und überarbeitet! Du hast eine lokale Variable in deiner falsch geschriebenen ChangeButtonActionPerformed-Methode, die ihren Inhalt nicht weitergibt. Fazit: Du setzt nur den Inhalt einer lokalen Variable und lässt sie dann "verfliegen".
Außerdem returned deine Methode einen String, soweit korrekt, aber mit dem String wird nicht weitergearbeitet. Du musst diesen String schon deiner Instanzvariablen zuweisen, sonst kennt die Halt keine Änderung.

Und bitte schau dir nochmal die Java-Konventionen an. Da hast du ne Menge Fehler drin!
 
Da fehlt es bei dir aber an den Grundlagen. Du erstellst zwei mal eine Variable Namens "saveLocation": Ein mal in deiner Frame-Methode und ein zweites mal in deinem ActionListener bzw. der Methode die der Listener aufruft.
Die haben miteinander rein gar nichts zu tun. Außerdem benutzt du deine zweite Variable gar nicht,wie Vorredner bereits sagte...
Was du eventuell suchst ist eine globale Variable.
 
stimmt. ich habe übersehen, dass du eine lokale Variable im Konstruktor aufrufst. Die ist natürlich auch futsch, wenn das ActionEvent ausgelöst und bearbeitet wird. Du bräuchtest eine Instanzvariable sonst wird das nichts!
 
Hi,
danke für die schnelle Hilfe!
Ich habe sofort meine variabeln umbenannt;-D
wie gesagt ich bin wirklich blutiger Anfänger....
Leider funktioniert das mit den Änderungen aber immer noch nicht:noe:
Er unterstreicht mir die Variable "savelocation".
mein Code sieht jetzt so aus :
Java:
	    MenuItem change = new MenuItem("Ändern");
	    sp.add(change);
	    
	    
	    	change.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
            	savelocation = ChangeButtonActionPerformed(evt);
            }
        });

Die Fehlermeldung lautet: "Cannot refer to a non-final variable savelocation inside an inner class defined in a different method"

Wie kann ich denn nun auf die Variable in der anderen Methode zugreifen?
 
Hallo Michael,
das habe ich auch schon probiert.. es hat aber keine Auswirkungen...
Java:
class SimpleFrame extends JFrame 
{
	String savelocation = "C:\\Documents and Settings\\e914\\Desktop\\Testfiles\\";
	
	
	public SimpleFrame(Document doc)  // Konstruktor
	{

und
Java:
	    MenuItem change = new MenuItem("Ändern");
	    sp.add(change);
	    
	    
	    	change.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
            	savelocation = ChangeButtonActionPerformed(evt);
            }

und schließlich
Java:
    private String ChangeButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {
    savelocation = "C:\\"
    System.out.println("Speicherpfad neu: "+ savelocation);
    return savelocation;  //Savelocation in Frame funktion muss mit diesem wert überschrieben werden
    }

Er müsste die gloabale variable ja jetzt eigentlich an 2. Stellen überschreiben... Einmal beim Funktionseintritt und einmal wenn er den Actionlistener ausführt. Das ganze habe ich mit meinem System.out auch getestet. Er gibt in meinem Jframe den richtigen Speicherpfad aus.
Gehe ich nun aber in mein Jpanal hat er aber dort immer nur die alten werte von Jframe. Ich bekomme es nicht gebacken das er es im J Panal rafft wenn ich die globale Variable im Jfram Menü geändert habe.
Aufruf des Jpanel im Jframe:
Java:
		SimplePanel panel = new SimplePanel(savelocation);   
		Container cp = getContentPane();	     //Container beschafft
		cp.add(panel);

und dann im JPanel weiter mit:
Java:
public SimplePanel(final String savelocation)
{     
			setLayout(null); // Layoutmanager abgeschaltet
.
.
.

dann mit :
Java:
        transformation.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                	TransformationButtonActionPerformed(evt, savelocation);
                }
            });
und schließlich die funktion die es ausgeben soll udn immer den alten Pfad asugibt:
Java:
private void TransformationButtonActionPerformed(java.awt.event.ActionEvent evt, String savelocation) 
{
	 System.out.println("Speicherpfad neu123: "+ savelocation);
}

Sorry für den langen text :-( bin wirklich am verzweifeln....
 
Meine Vermutung (da ich nicht alle Zusammenhänge kenne):
Du übergibst zu Beginn den String an die Klasse SimplePanel, anschließend wird der String in der Klasse SimpleFrame im ActionListener neu gesetzt (eigentlich wird hier die Referenz der String Variable auf ein neues Objekt gesetzt).
Nun hoffst Du, dass der geänderte Wert auch in SimplePanel verfügbar ist.
Das geht so nicht, und würde
Code:
Call by Reference
voraussetzen, Java kennt allerdings nur
Code:
Call by Value
, d.h. Du musst den geänderten Wert erneut an die SimplePanel übergeben oder das Problem anders lösen.
 
Die Klasse
Code:
SimplePanel
benötigt eine Methode z.B.
Java:
public void setSaveLocation(String newSaveLocation) {
    saveLocation = newSaveLocation;
}
Im ActionListener (dafür muss natürlich die Instanz der SimplePanel Klasse im ActionListener bekannt sein) wird dann diese Methode mit dem neuen Wert aufgerufen.
 

Zurück
Oben