Klassen Auf andere Klassenobjekte zugreifen

Waterfront

Mitglied
Moin!

Ich habe Grundlegend was nicht verstanden, ich kann mehrere Klassen erstellen aber ich muss doch irgendwie auf die Objekte einer anderen Klasse zugreifen können !?!

Also ich habe mit Eclipse (Window Builder) ein GUI erstellt und habe dazu eine Hauptklasse. Und mit dieser Hauptklasse möchte ich jetzt den Text in dem TextPane schreiben lassen, bei start des Programms.

Das, wenn ich die Hauptklasse starte, die GUI Klasse sich dann auch öffnet, habe ich schon drinnen:

Java:
GUI start = new GUI();
	    start.setVisible(true);

Ich habe dann mit Google verschiedene Sachen gelesen/versucht :rtfm: aber ich kam nicht auf das was ich erreichen will.

LG
Water
 
Meinst du sowas?

Java:
DeineKlasse klasse2 = new DeineKlasse();
klasse2.deinTextpane.setText("hello world");

Ich denke sowas funktioniert, probiers mal aus, ansonsten kann mich gerne jemand verbessern 😉
 
Zuletzt bearbeitet:
öffentliche Getter bzw. Setter sind hier denke ich das was du suchst, damit kannst du von außerhalb des Objektes auf private Attribute der jeweiligen Klasse zugreifen.

Java:
public class MeinObjekt{

  private String text;

  public void setText(String s){
     this.text = s;
  }

  public String getText(){
    return this.text;
  }
}

Angenommen du hast nun eine Instanz dieser Klasse :

Java:
MeinObjekt objekt = new MeinObjekt();

dann kannst du jetzt von außen über den öffentlich deklarierten Setter auf das Attribut zugreifen und dieses verändern.

Java:
objekt.setText("Hallo, ich bin ein String!");

ebenso funktioniert das ganze wenn du in einem anderen Objekt eine Referenz auf dieses Objekt hälst,

z.B

Java:
public class Test{

 private MeinObjekt objekt;

 public Test(MeinObjekt objekt){
       this.objekt = objekt;
 }

 public void print(){
   System.out.println(this.objekt.getText());
 }

}

so kannst du z.B wenn du ein Objekt der Klasse Test erzeugst , eine Instanz der Klasse MeinObjekt übergeben und über die Methode print der Klasse Test , welche die Methode getText() der Klasse MeinObjekt aufruft den Wert des Attributes des jeweiligen Objektes ausgeben. ( hier natürlich nur zur darstellungszwecken)

Java:
MeinObjekt obj = new MeinObjekt();
obj.setText("Test");

Test t = new Test(obj);
t.print();

Poste doch mal deinen Code dann kann man ggf. sehen wo dein Fehler liegt 😉
 
Zuletzt bearbeitet:
@kaoZ:
Ohne Getter/Setter - sprich so wie ich es kurz angedeutet habe funktioniert es nicht?
Java:
    DeineKlasse klasse2 = new DeineKlasse();
    klasse2.deinTextpane.setText("hello world");
 
Zuletzt bearbeitet:
Okay also ich habe jetzt in der GUI Class folgendes mit drin:

Java:
	private JTextPane textfeld;
	
	
	public void setText(String s){
		this.textfeld.setText(s);
	}

in der Main.class ist dazu noch:

Java:
  public static void main(String[] args) throws IOException, JSONException {
	    GUI start = new GUI();
	    start.setText(" BlaBlaBlaBlaaaaaa");   
	    start.setVisible(true); 
}

Dann kommt folgende Fehlermeldung im Compiler:
Java:
Exception in thread "main" java.lang.NullPointerException
	at GUI.setText(GUI.java:20)
	at Main.main(Main.java:19)
 
Guck dir nochmal meine zwei Codezeilen an und vergleich die mit deinen. Schau dir vorallem mal folgende Zeile bei dir an:

Java:
start.setText(" BlaBlaBlaBlaaaaaa");

Fällt dir was auf?
 
Java:
   GUI start = new GUI();
        start.namevomtextfeld.setText(" BlaBlaBlaBlaaaaaa");

So sollte es richtig heißen. Probier mal ob's so klappt. Du musst schon dein Objekt, in deinem Fall das Textfeld ansprechen.

Ändere dies mal ab und berichte ob's klappt.
 
Zuletzt bearbeitet:
Aaalso:

Ich habe das jetz wiefolgt in der Main.Class:

Java:
GUI start = new GUI();
	    start.textfeld.setText("Bla");

Aaaber:

Es kommt folgender Error:
Java:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The field GUI.textfeld is not visible

	at Main.main(Main.java:19)

Wenn ich dann die von Eclispe vorgeschlagene "change the visibility blaa" mache, dann wird erstmal alles als richtig angezeigt. Es wird in der Gui Klasse folgendes geänderrt:

Java:
//Von:

private JTextPane textfeld;

//Zu:

JTextPane textfeld;

Wenn ich dann das Programm ausführe kommt der Error (welcher die Zeile start.textfeld.setText("Bla"); meint):
Java:
Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:19)
 
Zuletzt bearbeitet:
Du hast um wirklich was nachvollziehen zu können zu wenig Code gepostet, hier mal ein schnell zusammengezimmertes Beispiel :

Vielleicht wird hier das OO nutzen ein wenig klarer 😉

Die Klasse Text bietet hier zu Anschauungszwecken nur einen Setter und einen Getter an, dies sollte im Standardfall vermieden werden da es sonst zu Inkonsistenzen bei der Objektinitialisierung kommen kann.

Hier ist aber das zusammenspiel der beiden Klassen relativ schön zu sehen, die Klasse Gui hält eine Referenz auf ein Text Objekt, und wird im Konstruktor der Klasse Gui Initialisiert, in der privaten Methode
Code:
init();
der Klasse Gui wird dann der JFrame initialisiert und über den getter der Klasse Text mit einem Titel gefüllt.

Man könnte hier den Fenstertitel auch direkt setzen aber es geht ja um das aufzeigen des Zugriffes auf nicht statische Methoden anderer Klassen

Text.java
Java:
public class Text {
	
	private String text;
	
	public Text() {}

	public void setText(String text){
		this.text = text;
	}
	
	public String getText(){
		return this.text;
	}
}


Gui.java
Java:
import java.awt.Dimension;

import javax.swing.JFrame;

public class Gui{
	
	private Text text;
	private JFrame frame;
	
	public Gui(String title) {
		text = new Text();  // setter der Klasse Text
		text.setText(title);
		init();
    }
	
	private void init(){
		frame = new JFrame(text.getText());  // getter der Klasse Text
		frame.setSize(new Dimension(250,300));
		frame.setLocationRelativeTo(null);
		
	}
	
	public void setVisible(){
		frame.setVisible(true);
	}
	
	public static void main(String[] args) {
	    Gui gui = new Gui("Mein Fenster");
	    gui.setVisible();
    }

}

Bei Fragen immer raus damit 😉

Natürlich kann man auch Attribute der Klasse mit einem öffentlichen Zugriffsmodifizierer ausstatten , dies sollte aber unter allen Umständen vermieden werden , da nur das Objekt selbst seinen Zustand ändern können sollte deshalb bietet man insofern ein ändern notwendig sein sollte , einen öffentlichen Setter an 😉

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The field GUI.textfeld is not visible

Das liegt daran das du hier versuchst auf ein privates attribut von außen zuzugreifen. angenommen die main Methode würde sich in einer anderen Klasse befinden, dann würde er dir dieses Attribut nicht einmal anzeigen da es eben nur innerhalb der Klasse sichtbar ist , anders sieht das ganze aus wenn man es entweder package private , protected oder sogar public deklariert, dann könnte man je nach Fall das Attribut auch direkt ansprechen, dies sollte wenn es sich nicht um eine Konstante handelt möglichst vermieden werden.
 
Zuletzt bearbeitet:
Mhh also damit ich nicht durcheinander komme habe ich mal ein neue Projekt gemacht und da dein Beispiel Code reingeschmissen.

Erstmal Danke, dass du so ausführlich mit Beispiel geantwortet hast!!! :toll: 😉

Also ich habe nicht ganz verstanden wofür in Gui.java "public Gui(String title)" ist und wofür in Text.java

Java:
	public void setText(String text) {
		this.text = text;
	}

	public String getText() {
		return this.text;
	}
ist.

Es ist aber schon richtig, das ich mit der zeile
Java:
Gui gui = new Gui("Mein Fensterino");
Den Namen von dem Fenster in der Gui.java festlegen ?!? ???:L

LG
Water
 
Den Namen von dem Fenster in der Gui.java festlegen ?!?

Hierbei ging es nur darum das du sehen kannst wie diese beiden Klasse zusammenarbeiten, eben getter und setter, also wie du aus der einen Klasse auf Attribute einer anderen Klasse bzw. eines anderen Objektes zugreifen kannst.

Also ich habe nicht ganz verstanden wofür in Gui.java "public Gui(String title)" ist und wofür in Text.java

dies diente nur als beispiel 😉

Java:
public Gui(String title){...}

ist der Konstruktor, in welchem hier der per Parameter vom Typ String an die Klasse / an den setter der klasse Text übergeben wird, und somit ein neues Text Objekt initialisiert wird.
 
Zuletzt bearbeitet:
So ich habe mir das jetzt mal nach ner Pause angeschaut und glaube ich habs verstanden. Also ich habe mit selber ein Beispiel gebastelt.
Funktionieren tun die Setter, jedoch geben mir die Getter beide "null" aus!?!

Hier mal der Komplette Code:

Java:
public class Hauptklasse {

	public static void main(String[] args) {
		Nebenklasse f = new Nebenklasse();
		f.setFrameText("Kappa");
		f.setLabelText("LabelText");
		
		System.out.println(f.getFrameText());
		System.out.println(f.getLabelText());
	}
}


Java:
import javax.swing.*;
import java.awt.Dimension;

public class Nebenklasse{ 

	private JFrame frame;
	private JLabel label;
	private String getFrameText;
	private String getLabelText;
	
	public void setFrameText(String text){
		frame = new JFrame(text);	
		init();
	}
	
	public void setLabelText(String text){
		label = new JLabel(text);
		label.setVisible(true);
		frame.add(label);
	}
	
	private void init(){		
		frame.setSize(new Dimension(250,300));
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
	
	public String getFrameText(){
		return getFrameText;		
	}
	
	public String getLabelText(){
		return getLabelText;		
	}
}
 
Nun, ich behaupte, das du es NICHT verstanden hast.
Du rufst auf
Java:
 System.out.println(f.getFrameText());
Schau mal was da gemacht wird?

Java:
	public String getFrameText() {
		return getFrameText;
	}
Es wird die Variable getFrameText zurückgegeben und die hat den Wert?
Code:
null
weil du nirgends einen Wert zuweist. Üblicherweise macht man das im setter also
Java:
	public void setFrameText(String text) {
		frame = new JFrame(text);
		init();
	}
Aber auch hier keine Wertzuweisung an getFrameText.
 
@TO

mal abgesehen davon sollte man die Objekterzeugung nicht erst im setter realisieren, den dafür ist dieser letzten endes eigentlich nicht gedacht, sondern lediglich dazu Werte im nachhinein verändern zu können, außerdem solltest du später diesen Setter nochmal aufrufen , weißt du jedes mal der Referenz ein neues Objekt zu, und dies ist mit unter sehr suboptimal 😉
 
Zuletzt bearbeitet:
Okay ich habe es umgeschrieben, hast recht ist irgendwie doof jedesmal bei setFrameText ein Frame rstellen zu lassen :bloed: Sonst irgendwelche Mängel?

Java:
public class Hauptklasse {

	public static void main(String[] args) {
		Nebenklasse f = new Nebenklasse();
		f.setFrameText("Kappa");
		f.setLabelText("LabelText");
		
		System.out.println(f.getFrameText());
		System.out.println(f.getLabelText());
	}
}

Java:
import javax.swing.*;
import java.awt.Dimension;

public class Nebenklasse{ 

	private JFrame frame;
	private JLabel label;
	private String getFrameText;
	private String getLabelText;
	
	public Nebenklasse(){
		frame = new JFrame();
		frame.setSize(new Dimension(250,300));
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		
		label = new JLabel();
		label.setVerticalAlignment(SwingConstants.CENTER);
		label.setHorizontalAlignment(SwingConstants.CENTER);
		label.setVisible(true);
		
		frame.add(label);		
	}
	
	public void setFrameText(String text){
		frame.setTitle(text);
	}
	
	public void setLabelText(String text){
		label.setText(text);
	}
	
	public String getFrameText(){
		getFrameText = frame.getTitle();
		return getFrameText;		
	}
	
	public String getLabelText(){
		getLabelText = label.getText();
		return getLabelText;		
	}
}
 
Zuletzt bearbeitet:
Hallo
Ich hab da eine Frage:
Hab zwei Klassen
Main:
public class main{
private int x;
private int z;
public main(){
z=3;
}
public void chanche_x(int z){
x=z;
System.out.print("x ist jetzt "+x+".");
}
}
Und eine sub >:
public class sub{
private main objekt;
public sub(main objekt){
this.objekt = objekt;
}
public void chanche_x(){
objekt.chanche_x(int z [.]);
}
}

Beim compilen kommt bei stelle [.]
der Fehler .class expectet
Hat jemand eine Idee was das sein könnte
 

Neue Themen


Zurück
Oben