Java Auf JTextField einer anderen Klasse zugreifen

b1gsh0w

Cadet 4th Year
Registriert
Mai 2009
Beiträge
91
Hey ho,

ich steh mom. dezent auf dem Schlauch.
Habe folgenden Code(-ausschnitt):

Code:
package gui;

import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Info extends JFrame{
	
	JLabel eingabe1;
	JLabel eingabe2;
	JLabel eingabe3;
	
	JTextField test1;
	JTextField test2;
	JTextField test3;

	JButton okButton;
	JButton schließenButton;
	JPanel testPanel;
	
	DateiTXT dl;
	DateiTXT ds;

	
	void fensterSchließen(){
		this.dispose();
	}
	
	public Info(){
		
		eingabe1 = new JLabel("Eingabe1");
		eingabe2 = new JLabel("Eingabe2");
		eingabe3 = new JLabel("Eingabe3");
		
		test1 = new JTextField();
		test2 = new JTextField();
		test3 = new JTextField();

		okButton = new JButton("Speichern");
		schließenButton = new JButton("Schließen");
		testPanel = new JPanel();
		
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);

		testPanel.add(eingabe1);
		testPanel.add(test1);
		testPanel.add(eingabe2);
		testPanel.add(test2);
		testPanel.add(eingabe3);
		testPanel.add(test3);
		testPanel.add(okButton);
		testPanel.add(schließenButton);
		
		dl.dateiLaden();
			
		
		okButton.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
					
				ds.dateiSpeichern();
				
			}
		});
		
		schließenButton.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				fensterSchließen();
			}
		});
		
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		this.setTitle("Test");
		this.setSize(200,125);
		
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		testPanel.setLayout(new GridLayout(4,2));
	
		this.getContentPane().add(testPanel);
		this.setVisible(true);
		
	}

}


Code:
package gui;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class DateiTXT {
	
	BufferedReader in;
	BufferedWriter out;

	String zeile1;
	String zeile2;
	String zeile3;
	
	String temp1;
	String temp2;
	String temp3;
	
	DateiTXT(){}
	
	public void dateiLaden(){

		try{
			in = new BufferedReader(new FileReader("test.txt"));
		
			zeile1 = in.readLine();
				test1.setText(zeile1);
		
			zeile2 = in.readLine();
				test2.setText(zeile2);
		
			zeile3 = in.readLine();
				test3.setText(zeile3);
			
			in.close();
		
		}
		catch(FileNotFoundException e){}
		catch(IOException e){}
	}
	
	public void dateiSpeichern(){
		
		try{
			out = new BufferedWriter(new FileWriter("test.txt"));
			
			temp1 = test1.getText();
			out.write(temp1);
			out.newLine();
			
			temp2 = test2.getText();
			out.write(temp2);
			out.newLine();
			
			temp3 = test3.getText();
			out.write(temp2);
			out.newLine();			
			
			out.close();
		}
		catch(FileNotFoundException e1){}
		catch(IOException e){}
	}

}

Im ersten Abschnitt habe ich eine Gui, darunter eine Klasse mit Methoden zum Speichern und Laden von Daten. Dazu muss ich auf die JTextFields aus der Info zugreifen. Wie mache ich das jetzt am besten? Mir fehlt iwie der Ansatz. oO

Bis jetzt bekomme ich noch die Meldung, dass test1-3 nicht resolved werden können.

Wenn ich bspw. eine Instanz von Info in DateiTXT laufen lasse (Info inf = new Info() oder sowas in der Art) und vor die Textfields noch "inf." schreibe, bekomme ich schonmal keinen syntaktischen Fehler, beim Zugriff auf die Info-Gui bekomme ich aber eine NullPointerException. Wo zeigt er da jetzt ins Leere?oO Das Prob wird mir dann bei der Methode dateiLaden(); angezeigt, also ist die Lösung auch falsch.
 
Du musst auf jeden Fall ein Objekt der Klasse Info in der Klasse DateiTXT instanziieren.
Z.B. (Achtung Pseudocode)

Info info = new Info(); (am besten im Konstruktor)

Dann kannst du mit:

info.test1, info.test2, info.test3

auf die Textfelder drauf zugreifen.

Ich sehe das also so, dass die eine Klasse im Moment nichts von der anderen weiß. Deswegen kannst du auch nicht auf Attribute der anderen Klasse zugreifen. Dies musst du (siehe oben) ändern.
 
Die NullPointerException kriegst du, weil du die Variablen dl und ds nicht initialisiert hast. Du musst also am richtigen Ort die folgenden Codezeilen einfügen.
ds = new DateiTXT();
dl = new DateiTXT();

Für dein anderes Problem kannst du wenn du in Info dann eine Instanz von DateiTXT erstellst "dich selbst mitgeben" z.B.
dl = new DateiTXT(this);

In DateiTXT brauchst du natürlich einen passenden Konstruktor.
Code:
public class DateiTXT {
    private Info inf;
    //Weitere Variablen
    public DateiTXT(Info inf) {
        this.inf = inf;
        //...
    }
    // Restlicher Code
}

So kannst du dann auf die Textfelder zugreifen.
 
Hm, meiner Meinung nach ist der Ansatz schon "falsch/unschön".

Warum sollte eine (mehr oder weniger) allgemeingültige Klasse, die das Lesen und Schreiben von Zeilen in einer Datei übernimmt, etwas von Textfeldern wissen!?

Ich würde die Klasse DateiTXT so bauen, dass sie ein String[] oder eine JList<String> zurück gibt.
Ungefähr so:
Code:
public class DateiTXT( File datei ) {

.....
....

public JList<String> load( ) {

....

}

public void write( JList<String> listeMitLines ) throws IOException...{

....

}

}

In deinem JFrame werden dann einfach nur noch die Methoden genutzt. Wie ich finde ein etwas sauberer (Objektorientierter) Ansatz. (der Code ist einfach ausm Kopf aufgeschrieben...)
 
Sry dass ich mich jetzt erst melde. Gott, wie konnte ich das nur übersehen oO
Läuft jetzt und hab String-Arrays benutzt. Sieht schicker aus :D
 
Zurück
Oben