Wert an andere Klasse übergeben

waeve

Mitglied
Hallo ihr,

ich bin mir sicher, dass es viel mehr zu diesem Thema zu lesen gibt, als ich bisher schon gelesen habe, und ich bin mir auch sicher, dass ich das eigentlich wissen sollte, aber ich tue es nicht. Also frage ich euch, in der Hoffnung, dass jemand so nett ist, es mir zu erklären ;-)

Habe 2 Klasse: Pan2 und ButtonToDo, ButtonToDo wird von Pan2 aufgerufen und erzeugt u.a. einen String mit dem Namen task. Dieser soll dem JButton in Pan2, der gedrückt wurde, übergeben werden.

Problem? Die Übergabe von task. Ich weiß einfach nicht wie. Ich rufe die Klasse und auch die Methode auf, aber in Pan2 kann ich den String nicht nutzen.

Java:
for (int i = 0; i < tasks.length; i++){
			tasks[i] = new JButton();
			tasks[i].setSize(50, 60);
			tasks[i].addActionListener( new ActionListener(){
				
				public void actionPerformed(ActionEvent ae) {
					
					for (int i = 0; i<tasks.length; i++){
						if(ae.getSource() == tasks[i]){
							todo.aufruf();							
						}
					}
				}
			});
			 
			this.add ( tasks[i]);			
		}

Java:
bestätigen.addActionListener(new ActionListener(){
			
			public void actionPerformed(ActionEvent e) {
				
				if (e.getSource() == bestätigen){
					
					task = name.getText();
					name.setText("");
					titel.setVisible(false);
					titel.dispose();					
					
				}
				
			}
		});

Ich hoffe das ist soweit verständlich 😀

Schon mal vielen Dank für eure Zeit und Hilfe!
 
Zuletzt bearbeitet von einem Moderator:
Und was genau ist nicht verständlich?

ich will String task in die Klasse Pan2 übergeben und dort einem angeklicktem JButton als Titel übergeben.
 
Alles. Du klatscht da einfach vollkommen kontextlos ein paar Zeilen Code hin, mit denen kein Mensch was anfangen kann. Hinzu kommt, dass dein eigentliches Problem offenbar gar nichts mit dem geposteten Code zu tun hat.
 
Java:
public class Pan2  extends JPanel {	
	
	private static final long serialVersionUID = 1L;
	JPanel pan2;
	JButton[] tasks = new JButton[49];
	ButtonToDo todo = new ButtonToDo(); //Aufruf der Klasse 
	
	public void erzeuge (){
		
		this.setBackground(Color.blue.darker());
		this.setSize(900, 800);		
		this.setLayout(new GridLayout(8, 7));	
		
		for (int i = 0; i < tasks.length; i++){
			tasks[i] = new JButton();
			tasks[i].setSize(50, 60);
			tasks[i].addActionListener( new ActionListener(){
				
				public void actionPerformed(ActionEvent ae) {
					
					for (int i = 0; i<tasks.length; i++){
						if(ae.getSource() == tasks[i]){
							todo.aufruf();	//Aufruf der Methode in welcher der Stiring erzeugt wird. 
						
						}
					}
				}
			});
			 
			this.add ( tasks[i]);			
		}
				
		this.setVisible(true);
		
	}
}

Java:
public class ButtonToDo extends JDialog {
	
	
	private static final long serialVersionUID = 1L;
	
	JDialog titel = new JDialog();
	final JPanel pan3 = new JPanel();
	FlowLayout anordnung = new FlowLayout();
	JLabel todo = new JLabel("Welche Aufgabe möchtest du übernehmen?");
	JTextField name = new JTextField(15);	
	JButton bestätigen = new JButton("Bestätigen");
	String task = new String();
	
	
	public void aufruf(){
		titel.setTitle("Aufbaben Titel");
		titel.setSize(350, 200);
		
		pan3.setLayout(anordnung);
		anordnung.setAlignment(FlowLayout.CENTER);
		
		bestätigen.setSize(40, 40);
		bestätigen.addActionListener(new ActionListener(){
			
			public void actionPerformed(ActionEvent e) {
				
				if (e.getSource() == bestätigen){
					
					task = name.getText();
					name.setText("");
					titel.setVisible(false);
					titel.dispose();					
					
				}
				
			}
		});
		
		pan3.add(todo);
		pan3.add(name);
		pan3.add(bestätigen);
		
		titel.add(pan3);
		titel.setVisible(true);
		
	}
}

Jetzt verständlicher?
 
Zuletzt bearbeitet von einem Moderator:
[ot]Benutze für deinen Java-Code doch bitte die
Java:
-Tags, danke! :)[/ot]

[quote="waeve, post: 1041050"]Und was genau ist nicht verständlich?[/QUOTE]

Du musst bedenken das du unsere Hilfe suchst, daher solltest du auch probieren dein Problem immer so ausführlich/genau wie möglich zu beschreiben :)
Auch musst du bedenken das wir deinen Text ohne Hintergrundinformationen lesen und uns daher alles andere was nicht erwähnt wir dazudenken müssen (raten usw.)

Zu deinem Problem:
Übergib der Klasse "ButtonToDo" eine Referenz deines Pan2 Objektes. Die Klasse Pan2 bietet eine Methode an welche einen String als Parameter erwartet.
Diese Methode rufst du dann einfach auf :)
 
Zuletzt bearbeitet:
Zunächst mal sollte ButtonToDo nicht gleichzeitig von JDialog abgeleitet sein und eine Instanzvariable vom Typ JDialog besitzen. Entweder Komposition oder (schlechter) Vererbung, aber definitiv nicht beides gleichzeitig.
Zweitens würde ich genau andersrum wie Joose machen: die ButtonToDo-Klasse wird erweitert um eine public String getTask() Methode, die den Inhalt des "name" Textfelds enthält. Wenn der Dialog modal ist, wird die Programmausführung anhalten, wenn der Dialog eingeblendet wird. Der Benutzer trifft dann seine Auswahl, schliesst den Dialog, und der Task kann mit getTask() abgefragt und in Pan2 verwendet werden.
Eine Klassenname "ButtonToDo" für etwas das kein Button ist, ist übrigens grauslich.
 
Hallo,

erstmal vielen Dank für eure Antworten!!
Und was genau ist nicht verständlich?
war nicht böse gemeint, sonder so wie ichs geschrieben haben. Was muss ich klarer erklären. Ich weiß, dass es schwer ist das Problem exakt zu beschreiben, wenn man schon den ganzen Tag daran sitzt 😉

So ich habe nun herumprobiert und folgendes Entdeckt:
Wenn ich dem ersten button einen Titel gebe, und anschließend den 2. anklicke erhält dieser den Text des 1. Der 1. bleibt textlos. Genauso wie alle folgenden Button. Nur der 2. hat den falschen Text. und wenn ich diesen erneut anklicke wird er wieder leer.
ich habe mir an unterschiedlichen Stellen mal die Variablen auf der Konsole ausgeben lassen. Es wird immer ausgegeben, jedoch wird die 1. 2x ausgegeben und alle folgenden mit einigen Leerzeilen dazwischen.
Könnt ihr mir das erklären? Und mir sagen, was ich ändern muss, damit es funktioniert?

Hier noch mal der Code
Pan2
Java:
package start1;

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

import javax.swing.*;

public class Pan2  extends JPanel {	
	
	private static final long serialVersionUID = 1L;
	JPanel pan2;
	
	JLabel [] labwo = new JLabel[7];
	String[] wochentag = {"Montag", "Dienstag","Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sontag"}; 

	JButton[] tasks = new JButton[49];
	ButtonToDo todo = new ButtonToDo();
//	final String titel = new String();
	
	public void erzeuge (){
		
		this.setBackground(Color.blue.darker());
		this.setSize(900, 800);		
		this.setLayout(new GridLayout(8, 7));
		
		for(int w = 0; w<labwo.length; w++)
		{
			labwo[w] = new JLabel(wochentag[w], JLabel.CENTER);
			this.add(labwo[w]);			
		}	
		
		
		
		for (int i = 0; i < tasks.length; i++){
			tasks[i] = new JButton();
			tasks[i].setSize(50, 60);
			tasks[i].addActionListener( new ActionListener(){
				
				public void actionPerformed(ActionEvent ae) {
					
					for (int i = 0; i<tasks.length; i++){
						if(ae.getSource() == tasks[i]){
							todo.aufruf();
							final String titel = todo.getTask();
							System.out.println(titel);
							tasks[i].setText(titel);
							
							
						}
					}
				}
			});
			
			this.add ( tasks[i]);			
		}
				
		this.setVisible(true);
		
	}
}

ButtonToDo
Java:
package start1;

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

import javax.swing.*;

public class ButtonToDo {
	
	JDialog titel = new JDialog();
	final JPanel pan3 = new JPanel();
	FlowLayout anordnung = new FlowLayout();
	JLabel todo = new JLabel("Welche Aufgabe möchtest du übernehmen?");
	JTextField name = new JTextField(15);	
	JButton bestätigen = new JButton("Bestätigen");
	String task = new String();	

	
	public void aufruf(){
		titel.setTitle("Aufbaben Titel");
		titel.setSize(350, 200);
		
		pan3.setLayout(anordnung);
		anordnung.setAlignment(FlowLayout.CENTER);
		
		bestätigen.setSize(40, 40);
		bestätigen.addActionListener(new ActionListener(){
			
			public void actionPerformed(ActionEvent e) {
				
				if (e.getSource() == bestätigen){					
					task = name.getText();
					name.setText("");
					titel.setVisible(false);
					titel.dispose();
					System.out.println(task);
				}			
			}
		});
		
		pan3.add(todo);
		pan3.add(name);
		pan3.add(bestätigen);
		
		titel.add(pan3);
		titel.setVisible(true);		
	}
	
	public String getTask(){
		return task;
	}	
}


Danke schon mal 🙂
 
In den ActionListenern deiner tasks ist

todo.aufruf()

nicht-modal, d.h. das Programm zeigt den JDialog an, wartet aber nicht auf die Eingabe - der ActionListener läuft "im Hintergrund" weiter/zu Ende, womit

titel = todo.getTask();

immer das noch "leere" ButtonToDo.task erwischt. Das lässt sich beheben durch

titel.setModal( true );

in ButtonToDo.erzeuge() .
 

Zurück
Oben