Erste Schritte String von anderer Klasse auf TextArea von erster Klasse

feve

Mitglied
Hallo Allerseits,

ich hab ziemliche Probleme was das verknüpfen 2er Klassen bzw. deren Objekte angeht.
Ich habe zwei Klassen die Klasse Test mit der TextArea mit Namen ta und einen Knopf der in einer Klasse KnopfAktion definiert ist dort gibt es viele System.out.println's die ich auf das TextArea der ersten Klasse ausgeben möchte. Vllt erst so, dass es funktioniert und dann später eine Methode schreiben, die z.B
String s = "anfang";
sprich(s) // auf den TextArea Ausgibt

vllt. kann mir jemand helfen.

Danke im Vorraus Eve

Java:
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;


public class Test extends Frame
{
 public Test()
 {
	    //Mein Frame
	    this.setLayout(null);
	    this.setBackground(Color.white);
	    this.setSize(800,600);
	    this.setLocation(300,200);
	    this.addWindowListener(new Schliesser());
	    
	    
	    // Einfacher Knopf
	    Button b = new Button("Mach was");
		b.setBackground(Color.gray);
		b.setSize(200, 200);
		b.setLocation(100, 100);
		b.addActionListener(new KnopfAktion());
		this.add(b);
		
		// TextArea fuer Info Ausgabe
		TextArea ta = new TextArea();
		ta.setBackground(Color.orange);
		ta.setBounds(350, 200, 400, 350);
		ta.setForeground(Color.BLACK);
		add(ta);
		
		
		Ausgabe aus = new Ausgabe(ta);
			
	    this.setVisible(true); 
 }
}

Die Klasse mit der ich eigentlich die sprich Methode machen wollte
Java:
import java.awt.TextArea;


public class Ausgabe 
{
	public Ausgabe(TextArea mta)
	{	
		
		String s = "hallo";
		
		mta.append(s);
	}

}
Java:
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.awt.TextArea;

public class KnopfAktion implements ActionListener 
{

	public void actionPerformed(ActionEvent e)
	{
		String s2 = "soll auf TextArea";
		
		//Irgendwie ein Objekt erstellen von Ausgabe 
		//Aber weiß nicht wie ? 
		Ausgabe a2 = new Ausgabe(TextArea ta);		// Fehler Meldung TextArea can not be resolved
		ta.append(s2);
	}
}
 
Warum lässt du deine TextArea denn nicht in einer statischen Referenz halten und packst dann eine getter Methode dazu, damit man auf die zugreifen kann?
 
Danke für die Antwort..

das Problem ist nur ich weiß weder was eine statische Referenz noch eine getter Methode ist.

Ich versteh einfach nicht genau wie ich den anderen klassen klar machen kann, dass sie das textarea ansprechen sollen..hm;(
 
Java:
public class Test extends Frame
{
  private static Frame frame; // eine statische Referenz auf einen Frame

  public static Frame getFrame() // Getter Methode für einen statischen Frame 
  {
    return frame;
  }
...

In deinem Fall bräuchtest du eben keinen Frame, sondern eine TextArea.
Generell empfiehlt es sich keinen Frame, sondern JFrame (Swing anstelle von AWT) zu verwenden. Gleiches gilt für deine anderen Komponenten.
 
Hallo hier mal ein kleines Beispiel, welches den Zugriff nochmal verdeutlicht.

Wir haben eine Klasse Test

Java:
public class Test {
	
	public static void main(String[] args) {
		
		Test2 t = new Test2();
		
		System.out.println(t.getJtf().getText());
		
		t.getJtf().setText("Wir verändern den Text zur Laufzeit.");
		
		System.out.println(t.getJtf().getText());
	}
}

und eine Klasse Test2

Test2 besitzt eine Instanzvariable jtf diese ist private und zum Zugriff hat sie getter und setter Methoden. Diese werden in der Klasse Test verwendet um auf das TextArea zu zugreifen.

Java:
import javax.swing.*;

public class Test2{
 
	private JTextArea jtf;
	

	public Test2(){
		
		JFrame f = new JFrame("Test Fenster");
		f.setDefaultCloseOperation(3);
		f.setSize(400,400);
		
		jtf = new JTextArea();
		jtf.setText("Irgendein Text");
		
		f.add(jtf);
		
		f.setVisible(true);
	}
	public JTextArea getJtf() {
		return jtf;
	}

	public void setJtf(JTextArea jtf) {
		this.jtf = jtf;
	}
}
 
ich glaub ich bin der lösung schon ziemlich nah..

Fab1 ich versteh nur nicht warum kann ich dass nicht machen .. kann ich nur in einer Main Methode die TextArea ändern würd sie gern in so einer Methode irgendwie ändern (ja man merk schon ist spät sry..)
Java:
public class KnopfAktion 
{
	public void KnopfAction()
	{
	mTest2 t2 = new mTest2();
	t2.getJtf().setText("Diesmal aus einer anderen klasse namens KnopfAktion");
	System.out.println(t2.getJtf().getText());
	}
}
Java:
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.TextField;
import javax.swing.JFrame;
import javax.swing.JTextArea;


public class mTest2 extends Frame
{
	
	
	private JTextArea jtf;
    
	 
    public mTest2(){
        
        JFrame f = new JFrame("Test Fenster");
        f.setDefaultCloseOperation(3);
        f.setSize(400,400);
        
        jtf = new JTextArea();
        jtf.setBackground(Color.black);
        jtf.setForeground(Color.green);
        jtf.setText("Irgendein Text");
        
        f.add(jtf);
        
        f.setVisible(true);
    }
    public JTextArea getJtf() {
        return jtf;
    }
 
    public void setJtf(JTextArea jtf) {
        this.jtf = jtf;
    }
}
 
Das kannst du nicht machen, weil du eben eine Referenz brauchst, auf genau das Objekt, welches zu verändern willst.
Fab1 hat dir damit allgemein verständlich machen wollen, wie ein Zugriff auf Attribute von Klassen funktioniert. Ich wollte dir klar machen, wie du an Objekte kommst, die erstellt hast, ohne dass du in einer Methode alles machen musst 😉
Java:
public void KnopfAction()
    {
    mTest2 t2 = new mTest2();
    t2.getJtf().setText("Diesmal aus einer anderen klasse namens KnopfAktion");
    System.out.println(t2.getJtf().getText());
    }

Das ganze läuft darauf hinaus, dass du da einfach nur ein neues Objekt erzeugst. Das bringt dir nichts 🙂
Du willst ja, dass du an deinem erst erstellten Objekt, etwas verändert 😉
 
hm..ziemlich kompliziert das ganze.. ich glaub ich leg mich erstmal in mein Bett und versuch morgen drann zu arbeiten. Denke mal wenn man es einmal verstanden hat ist es nicht so schwer.. naja danke Jungs LG feve (Efa)

Ja ist irgendwie einleuchtend.. weil ich ja ein neues Objekt erstell ..hm ach das wird noch ein spaß das studium
 
Eigentlich ist es ganz einfach, wenn man es einmal verstanden hat 😉

Du brauchst einfach nur irgendwo eine statische Referenz anzulegen, damit du darauf zugreifen kannst. Ich glaube ich gebe mal ein einfaches Beispiel:
Angenommen, man hat eine Klasse "GUI", welche als Attribute einen JFrame und eine JTextArea hat.
Java:
public class GUI 
{
  private JFrame frame;
  private JTextArea textArea;

  ... // hier ist dann noch ein Konstruktor, der die Klassen auch sinnvoll initialisiert und zusammenfügt ;)

  public JFrame getFrame()
  {
    return frame;
  }

  public JTextArea getTextArea()
  {
    return textArea;
  }
}

Wenn das Programm nun startet, dann erstellt es eine Instanz dieser Klasse und legt diese dort ab, wo man auch wieder ran kommt:

Java:
public static void main(String[] args)
{
  GUI gui = new GUI();
  gui.getFrame().setVisible(true); // Holt sich den Frame und macht ihn sichtbar
  ReferenceHolderExample.setGUI(gui); // Rufe die statische Methode "setGUI" der Klasse "ReferenceHolderExample" auf.
}
Hier noch einmal die Klasse ReferenceHolderExample:
Java:
public class ReferenceHolderExample
{
  private static GUI activeUI;

  public static void setGUI(GUI ui)
  {
    activeUI = ui;
  } 

  public static GUI getGUI()
  {
    return activeUI;
  } 
}
Diese Klasse dient, in diesem Beispiel, nur dazu eine Referenz (statisch) auf ein Objekt (der Klasse GUI). Wenn nun irgendwas an dem JTextArea deiner GUI Instanz gemacht werden soll, kann man ganz einfach
Java:
GUI gui = ReferenceHolderExample.getGUI(); 
JTextArea area = gui.getTextArea();  // hier hast du die TextArea
aufrufen und damit hast du dein angezeigtes Objekt. Soetwas müsstest du auch machen, damit du an dein Objekt kommst. Das hier ist nur ein sehr vereinfachtes Beispiel, dennoch hoffe ich, dass es Aufschluss gibt.
 
Danke njans.. ich glaub ich brauch nochmal deine Hilfe.. bei mir kommt immer dieser Fehler

Exception in thread "main" java.lang.NullPointerException
at Start.main(Start.java:10)
Java:
import javax.swing.JTextArea;


public class Start {

	public static void main(String[] args) 
	{
		
		GUI gui = ReferenceHolderExample.getGUI();
		JTextArea area = gui.getTextArea();
		area.append("hallo");
		
		
	}

}

So habe ich die GUI Klasse gestaltet
Java:
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JTextArea;


public class GUI 
{
	  private JFrame frame;
	  private JTextArea textArea;	// war mal textArea;
	 
	  public GUI()
	  {
		  JFrame frame = new JFrame("Referenz Bsp");
		  frame.setSize(400,400);
		  frame.setBackground(Color.white);
		  
		  JTextArea textArea = new JTextArea();
		  textArea.setLocation(200, 200);
		  textArea.setBackground(Color.orange);
		 
		  
		  frame.add(textArea);
		  frame.setVisible(true);
	  }
	  
	  
	  
	  
	  public JFrame getFrame()
	  {
	    return frame;
	  }
	 
	  public JTextArea getTextArea()
	  {
	    return textArea;
	  }
	
}

Und die ReferenceHolderExample ist gleich geblieben
Java:
public class ReferenceHolderExample 
{
	private static GUI activeUI;
	
	
	public static void setGUI(GUI ui)
    {
		activeUI = ui;
	} 
		 
	
	public static GUI getGUI()
    {
	   return activeUI;
    } 
}
 
mmh, wo wollen wir anfangen^^

Java:
public class GUI 
{
      private JFrame frame;// dieser frame wird auch immer null bleiben
      private JTextArea textArea;   // diese textArea wird immer null bleiben
     
      public GUI()
      {
          JFrame frame = new JFrame("Referenz Bsp");// willst du die oben deklarierte Variable nutzen, muss es hier heißen:
//frame = new JFrame("Referenz Bsp"); gleiches sinngemäss für die textArea
          frame.setSize(400,400);
          frame.setBackground(Color.white);
          
          JTextArea textArea = new JTextArea();

du hast 2x eine textArea deklariert, eine als globale, einmal als lokale Variable, die nur im Konstruktor sichbar ist. Deine globale Variable wird immer null bleiben...u.a. daher kommt deine NPE.
Und deiner Klasse
Code:
ReferenceHolderExample
initialisiert nicht die GUI, da fehlt mir irgendwo ein [c]new Gui()[/c] oder ähnliches....
 
Zuletzt bearbeitet:
hm.. ich will doch einfach nur strings von einer anderen klasse auf mein JTextArea anzeigen lassen. Warum muss das so kompliziert sein ? ;(
 
Danke njans.. ich glaub ich brauch nochmal deine Hilfe.. bei mir kommt immer dieser Fehler

Exception in thread "main" java.lang.NullPointerException
at Start.main(Start.java:10)
Java:
import javax.swing.JTextArea;


public class Start {

	public static void main(String[] args) 
	{
		
		//GUI gui = ReferenceHolderExample.getGUI();  Das wird nichts werden, da der ReferenceHolder am Anfang noch kein Objekt von GUI hat 
                Gui gui = new GUI(); // neues Gui Objekt
                ReferenceHolderExample.setGui(gui); // Damit kennt der ReferenceHolder nun das Objekt.
		JTextArea area = gui.getTextArea();
		area.append("hallo");
	}

}

So habe ich die GUI Klasse gestaltet
Java:
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JTextArea;


public class GUI 
{
	  private JFrame frame;
	  private JTextArea textArea;	// war mal textArea;
	 
	  public GUI()
	  {
		  //JFrame frame = new JFrame("Referenz Bsp"); Du legst da eine lokale variable an, das willst du aber nicht. Du willst die Instanzvariable verwenden.
                  frame = new JFrame("Referenz Bsp"); //so muss es sein 
		  frame.setSize(400,400);
		  frame.setBackground(Color.white);
		  
		  //JTextArea textArea = new JTextArea();  selbes Problem hier
                  textArea = new JTextArea();
		  textArea.setLocation(200, 200);
		  textArea.setBackground(Color.orange);
		 
		  frame.add(textArea);
		  frame.setVisible(true);
	  }

	  public JFrame getFrame()
	  {
	    return frame;
	  }
	 
	  public JTextArea getTextArea()
	  {
	    return textArea;
	  }
	
}

Hab da mal etwas kommentiert.
Deine letzte Frage kann man auch anders stellen: Warum ist es so schwer eine Dampfmaschine zu bauen, ich will doch nur von A nach B. 😉
 

Neue Themen


Zurück
Oben