Variablen aus Action Listener lesen und weiterverarbeiten

Nodar

Mitglied
Hallo zusammen,

ich bin Einsteiger und habe folgendes Problem. Über den Action Listener sollen Eingaben aus einem JTextField gelesen und in eine Variable gespeichert werden um diese dann an anderer Stelle in Berechnungen einzubeziehen.

Das folgende ist der "Problemcode"

Java:
 anschaffungswert = new JTextField();
	    anschaffungswert.addActionListener(new ActionListener() {
	    	
	    	private String s;
	    	
	    	public void actionPerformed(ActionEvent arg0) {
	    		
	    		s = anschaffungswert.getText();
	    		//nutzdauer.setText(s);
	    	}
	    	
	    });
	    anschaffungswert.setBounds(35, 40, 86, 20);
	    fenster.getContentPane().add(anschaffungswert);
	    anschaffungswert.setColumns(10);

Ich kriege die Variable s da so einfach nicht "raus" ich hoffe irgendjemand weiß was ich meine. Danke schonmal!
 
Dann kann ich die Variable aber dennoch nicht einfach mit s ansprechen, oder? ???:L

- Syntax error on token "s", VariableDeclaratorId expected after
this token

Sind wahrscheinlich die letzten Anfängerfehler, aber ich hab ehrlich keine Ahnung mehr..
 
Java:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;


public class Abs_Rechner {
	private static JTextField anschaffungswert;
	private static JTextField nutzdauer;
	


	public static void main(String[] args){
		

	
		;
		//================================HAUPTFENSTER=============================================
	    JFrame fenster = new JFrame("AfA-Rechner");
	    fenster.setTitle("AfA-Rechner");
	    fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    fenster.setSize(320, 425);
	    fenster.getContentPane().setLayout(null);
	    
	  //================================ANSCHAFFUNGSWERT EINGABEFENSTER============================
	    
	
	    anschaffungswert = new JTextField();
	    anschaffungswert.addActionListener(new ActionListener() {
	    	
	    	
	    	public void actionPerformed(ActionEvent arg0) {
	    		
	    		String s = anschaffungswert.getText();
	    		//nutzdauer.setText(s);
	    	}
	    	
	    });
	    anschaffungswert.setBounds(35, 40, 86, 20);
	    fenster.getContentPane().add(anschaffungswert);
	    anschaffungswert.setColumns(10);
	    
	  //================================NUTZDAUER EINGABEFENSTER===================================
	    
	    nutzdauer = new JTextField();
	    nutzdauer.setBounds(181, 40, 86, 20);
	    fenster.getContentPane().add(nutzdauer);
	    nutzdauer.setColumns(10);
	    
	    JLabel lblNutzdauer = new JLabel("Nutzdauer");
	    lblNutzdauer.setHorizontalAlignment(SwingConstants.CENTER);
	    lblNutzdauer.setFont(new Font("Tahoma", Font.PLAIN, 10));
	    lblNutzdauer.setBounds(181, 25, 86, 14);
	    fenster.getContentPane().add(lblNutzdauer);
	    
	    JLabel label_1 = new JLabel("Anschaffungswert");
	    label_1.setHorizontalAlignment(SwingConstants.CENTER);
	    label_1.setFont(new Font("Tahoma", Font.PLAIN, 10));
	    label_1.setBounds(35, 25, 86, 14);
	    fenster.getContentPane().add(label_1);
	    
	    JTextArea buchwert = new JTextArea();
	    buchwert.setEditable(false);
	    buchwert.setBounds(10, 71, 136, 280);
	    fenster.getContentPane().add(buchwert);
	    
	    JTextArea abschreibungsbetrag = new JTextArea();
	    abschreibungsbetrag.setEditable(false);
	    abschreibungsbetrag.setBounds(156, 71, 136, 280);
	    fenster.getContentPane().add(abschreibungsbetrag);
	    
	    JMenuBar menuBar = new JMenuBar();
	    menuBar.setBounds(0, 0, 304, 20);
	    fenster.getContentPane().add(menuBar);
	    
	    JButton btnBerechnen = new JButton("Berechnen");
	    btnBerechnen.setBounds(10, 356, 284, 23);
	    fenster.getContentPane().add(btnBerechnen);
	    fenster.setVisible(true);
	}
	  //================================RECHNER=============================================
	  	
	 
	
	}
 
Zuletzt bearbeitet:
So ist es zumindest gedacht. Da ist ja auch noch ein zweites Textfeld "Nutzdauer", wenn diese beiden Werte enthalten und man auf Berechnen klickt, sollen die Variablen gespeichert und damit gerechnet werden. Simple Idee, eigt., aber doch komplexer als ich dachte in der Umsetzung 😳
 
Dann muss der Button den ActionListener bekommen

Code:

Java:
package de.max96.help;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class Abs_Rechner
{
	private static JTextField anschaffungswert;
	private static JTextField nutzdauer;

	public static void main(String[] args)
	{
		// ================================HAUPTFENSTER=============================================
		JFrame fenster = new JFrame("AfA-Rechner");
		fenster.setTitle("AfA-Rechner");
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.setSize(320, 425);
		fenster.getContentPane().setLayout(null);

		// ================================ANSCHAFFUNGSWERT
		// EINGABEFENSTER============================

		anschaffungswert = new JTextField();
		anschaffungswert.setBounds(35, 40, 86, 20);
		fenster.getContentPane().add(anschaffungswert);
		anschaffungswert.setColumns(10);

		// ================================NUTZDAUER
		// EINGABEFENSTER===================================

		nutzdauer = new JTextField();
		nutzdauer.setBounds(181, 40, 86, 20);
		fenster.getContentPane().add(nutzdauer);
		nutzdauer.setColumns(10);

		JLabel lblNutzdauer = new JLabel("Nutzdauer");
		lblNutzdauer.setHorizontalAlignment(SwingConstants.CENTER);
		lblNutzdauer.setFont(new Font("Tahoma", Font.PLAIN, 10));
		lblNutzdauer.setBounds(181, 25, 86, 14);
		fenster.getContentPane().add(lblNutzdauer);

		JLabel label_1 = new JLabel("Anschaffungswert");
		label_1.setHorizontalAlignment(SwingConstants.CENTER);
		label_1.setFont(new Font("Tahoma", Font.PLAIN, 10));
		label_1.setBounds(35, 25, 86, 14);
		fenster.getContentPane().add(label_1);

		JTextArea buchwert = new JTextArea();
		buchwert.setEditable(false);
		buchwert.setBounds(10, 71, 136, 280);
		fenster.getContentPane().add(buchwert);

		JTextArea abschreibungsbetrag = new JTextArea();
		abschreibungsbetrag.setEditable(false);
		abschreibungsbetrag.setBounds(156, 71, 136, 280);
		fenster.getContentPane().add(abschreibungsbetrag);

		JMenuBar menuBar = new JMenuBar();
		menuBar.setBounds(0, 0, 304, 20);
		fenster.getContentPane().add(menuBar);

		JButton btnBerechnen = new JButton("Berechnen");
		btnBerechnen.setBounds(10, 356, 284, 23);
		btnBerechnen.addActionListener(new ActionListener()
		{

			@Override
			public void actionPerformed(ActionEvent arg0)
			{
				System.out.println(anschaffungswert.getText());
			}

		});
		
		fenster.getContentPane().add(btnBerechnen);
		
		fenster.setVisible(true);
	}
	// ================================RECHNER=============================================

}
 
Dann muss der Button den ActionListener bekommen

Der Code, bei dem dem actionPerformed auf dem Textfeld liegt funktioniert damit genausogut, nur dass du dabei die Action mit der Enter-Taste auslöst, während der Cursor im TF is 😉

Vielleicht lässt du beide Varianten drin, dann kann man entweder auf den Button klicken oder die Eingabe direkt bestätigen.
 
Dann schreib dir am besten doch eine neue Methode, die von beiden Listenern aufgerufen wird, z.B. so:

Java:
package de.max96.help;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class Abs_Rechner
{
	private static JTextField anschaffungswert;
	private static JTextField nutzdauer;

	public static void main(String[] args)
	{
		// ================================HAUPTFENSTER=============================================
		JFrame fenster = new JFrame("AfA-Rechner");
		fenster.setTitle("AfA-Rechner");
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.setSize(320, 425);
		fenster.getContentPane().setLayout(null);

		// ================================ANSCHAFFUNGSWERT
		// EINGABEFENSTER============================

		anschaffungswert = new JTextField();
		anschaffungswert.setBounds(35, 40, 86, 20);
		fenster.getContentPane().add(anschaffungswert);
		anschaffungswert.setColumns(10);
		
		anschaffungswert.addActionListener(new ActionListener()
		{

			@Override
			public void actionPerformed(ActionEvent arg0)
			{
				machWas();
			}

		});

		// ================================NUTZDAUER
		// EINGABEFENSTER===================================

		nutzdauer = new JTextField();
		nutzdauer.setBounds(181, 40, 86, 20);
		fenster.getContentPane().add(nutzdauer);
		nutzdauer.setColumns(10);

		JLabel lblNutzdauer = new JLabel("Nutzdauer");
		lblNutzdauer.setHorizontalAlignment(SwingConstants.CENTER);
		lblNutzdauer.setFont(new Font("Tahoma", Font.PLAIN, 10));
		lblNutzdauer.setBounds(181, 25, 86, 14);
		fenster.getContentPane().add(lblNutzdauer);

		JLabel label_1 = new JLabel("Anschaffungswert");
		label_1.setHorizontalAlignment(SwingConstants.CENTER);
		label_1.setFont(new Font("Tahoma", Font.PLAIN, 10));
		label_1.setBounds(35, 25, 86, 14);
		fenster.getContentPane().add(label_1);

		JTextArea buchwert = new JTextArea();
		buchwert.setEditable(false);
		buchwert.setBounds(10, 71, 136, 280);
		fenster.getContentPane().add(buchwert);

		JTextArea abschreibungsbetrag = new JTextArea();
		abschreibungsbetrag.setEditable(false);
		abschreibungsbetrag.setBounds(156, 71, 136, 280);
		fenster.getContentPane().add(abschreibungsbetrag);

		JMenuBar menuBar = new JMenuBar();
		menuBar.setBounds(0, 0, 304, 20);
		fenster.getContentPane().add(menuBar);

		JButton btnBerechnen = new JButton("Berechnen");
		btnBerechnen.setBounds(10, 356, 284, 23);
		btnBerechnen.addActionListener(new ActionListener()
		{

			@Override
			public void actionPerformed(ActionEvent arg0)
			{
				machWas();				
			}

		});
		
		fenster.getContentPane().add(btnBerechnen);
		
		fenster.setVisible(true);
	}
	// ================================RECHNER=============================================
	
	private static String s; 
	
	private static void machWas()
	{
		s = anschaffungswert.getText();
		System.out.println(s);
	}

}
 
Viel Spaß beim weiter machen und nicht den Kopf verlieren 😉


P.S.: Noch so nebenbei, setBounds ist nicht unbedingt die beste Methode, ein LayoutManager hilft dabei.
Und markierst du das Thema bitte als erledigt
 
Was auch hübsch ist, ist in der actionPerformed-Methode des Textfelds
Code:
btnBerechnen.doClick();
aufzurufen.
Damit wird der Button auf der GUI tatsächlich "gedrückt", also so, dass man es sieht, dabei wird dann auch sein Actionlistener angesprochen. Das Schicke ist, dass der User sofort erkennt, welche Aktion ausgeführt wird, er sieht aucvh gleich, welche alternative Klickmöglichkeit er hat. Das ist für deine Oberfläche vielleicht ohnehin eindeutig, aber wenn du sie um mehrere Buttons erweitern solltest...
 

Zurück
Oben