Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich versuche es kurz zu fassen.....ich verstehe nich ganz was public für ne Aufgabe hat. Normalerweiße heißt es doch das variablen und Methoden auch auserhalb der Klasse sichtbar sind und aufgerufen werden können.
Hier mein kleines Beispiel. Die Klasse main hab ich aus Platzgründen ausgelassen, hier werden nur die Panels auf die Contentpane gelegt.
Mein Problem: Ich lege den Button auf das A42Paneloben, möchte allerdings das JTextField zahl1 an A42Berechnen übergeben....mit den Übergabeparametern kann ich hier leider nicht arbeiten.....nun hab ich zahl1 auf public gesetzt und dachte nun ich kann über den Klassennamen z.b. A42Panel.zahl1 auf das JTextfiel in der Klasse A42Berechnen zugreifen....und das verstehe ich nicht....selbst wenn ich eine public Methode in die Klasse A42Panel schreibe, die das JTextField zahl1 zurückgibt, kann ich nicht außerhalb auf die Methode zugreifen. Setze ich JTextField zahl1 static, so funktioniert das ganze, aber ich habe gehört das wäre dann nicht objektorientiert und wäre nicht gut.
Wo ist hier mein Denkfehler bezüglich public und wie löse ich die Aufgabe auf einfach und richtige Weise....bin für jede Hilfe sehr dankbar....
Grüße
impression
Code:
///////////////////////A42Paneloben///////////////////////////
class A42Paneloben extends JPanel{
A42Paneloben(){
add(new A42Berechnen());
}
}
///////////////////////A42Panel///////////////////////////
class A42Panel extends JPanel{
public JTextField zahl1 = new JTextField(8);
A42Panel(){
super();
add(zahl1);
}
}
///////////////////////A42Berechnen///////////////////////////
class A42Berechnen extends JButton implements ActionListener{
A42Berechnen(){
super("berechnen");
this.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
}
}
Man nennt das ja objektorientierte Programmierung. Und nicht klassenorientierte Programmierung. Man braucht bei allem, was nicht static ist, ein Objekt, um darauf zugreifen zu können. Und OB man darauf zugrifen darf, wird durch public/protected/private geregelt.
Code:
class X
{
public int a;
private int b;
}
class Y
{
void foo()
{
X x = new X(); // Objekt anlegen
x.a = 123; // a ist public: Das geht
x.b = 456; // b ist private: Das geht NICHT
}
}
Ich sehe mal das hier möchte allerdings das JTextField zahl1 an A42Berechnen übergeben
als den Kern der Frage... Dabei ist allerdings noch unklar, wo z.B. ein Objekt vom Typ A42Paneloben erstellt wird
Code:
///////////////////////A42Paneloben///////////////////////////
class A42Paneloben extends JPanel{
A42Paneloben(JTextField zahl1){
add(new A42Berechnen(zahl1));
}
}
///////////////////////A42Panel///////////////////////////
class A42Panel extends JPanel{
public JTextField zahl1 = new JTextField(8);
A42Panel(){
super();
add(zahl1);
}
}
///////////////////////A42Berechnen///////////////////////////
class A42Berechnen extends JButton implements ActionListener{
private JTextField zahl1;
A42Berechnen(JTextField zahl1){
this.zahl1 = zahl1;
super("berechnen");
this.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
zahl1.setText("Hallo!");
}
}
// Wo auch immer:
A42Panel a42Panel = new A42Panel();
A42Paneloben a42Paneloben = new A42Paneloben(a42Panel.zahl1); // Geht, weil zahl1 public ist
Allerdings ist das ganze so nicht besdonders schön strukturiert. Man sollte eigentlich NIE irgendwelche Variablen direkt 'public' machen, sondern get/set-Methoden verwenden. Und ... eine Klasse, die von JButton erbt, ist SEHR ... unkonventionell. Das sollte man auch nicht machen, wenn man nicht genau weiß, was man da tut...
Hey vielen Dank.....ich glaub ich habs verstanden....mein Denkfehler war, das ich natürlich erstmal ein neues Objekt der Klasse erzeugen muss um auf das JTextField dieser Klasse von außen zugreifen zu können.
Jetzt stellt sich mir allerdings die nächste Frage.
In Deinem Beispiel legst Du ja ein neues Objekt der Klassen A42Paneloben an um wie gesagt auf das JTextField zuzugreifen.....allerdings handelt es sich hier nun um ein neues Objekt, und somit auch um ein neues JTextField.....sprich wenn ich dann den Button klicke und es wird Text an das JTextField übergeben, dann nicht an das ursprüngliche aus der Klasse A42Panel....sondern von dem neu erzeugten Objekt oder? Das gleiche gilt auch umgekehrt....wenn ich was von dem JTextField mit getText() erhalten möchte, dann bringt es doch nix ein neues Objekt der Klasse anzulegen oder?
Mein Tip: Konsolenanwendungen!! Schreibt solange Konsolenanwendungen, bis ihr den Sinn der OOP begriffen gabt!!
Immer und immer wieder - bis es zu den Ohren wieder rauskommt. Dann kann man sich an GUI wagen.
Sorry....uns wurde das an der Uni so beigebracht....wir haben gleich mit Swing Komponenten angefangen um uns das bildlicher vorzustellen ......zudem hab ich in 2 Wochen Prüfungen....Hilfe :bae:
Das TextField wird erst dann erstellt, wenn ein Objekt der Klasse erstellt wird, die es enthält.
Ein Beispiel (ungetestet)
Code:
class PseudoTexField
{
public PseudoTextField()
{
System.out.println("TextField wird angelegt!");
}
}
class X
{
public PseudoTexField pseudoTexField = new PseudoTexField();
}
class Y
{
void foo()
{
X x = new X(); // Erst JETZT wird das PseudoTexField angelegt! Vorher existierte es nicht!
}
}
Oder auch so:
Code:
class X
{
public JTexField textField = new JTextField();
}
ist (praktisch, fast) das gleiche wie
Code:
class X
{
public JTexField textField = null;
public X()
{
textField = new JTextField();
}
}