Programmieren - alles kontrollieren 4.942 Themen, 20.719 Beiträge

Java Problem...objekte und JFrame+vererbung....

Matthias! / 7 Antworten / Baumansicht Nickles

ich bin echt ratlos.mein problem sieht folgendermaßen aus:

ich habe ein programm,daß in drei Ssprachen laufen soll.

anfangs baut sich ein abfrageframe auf,bei dem man die sprache wählen soll.danach kommt der hauptframe,daß eigentliche programm.

ich habe alle namen,überschriften,etc in jeweils einer klasse pro sprache,die von einer oberklasse erbt.

der erste frame benutzt drei buttons.in der ActionPerformed Methode möchte ich einen konstruktor von der entsprechenden sprachklasse haben und dieses objekt dann als parameter an den hauptframe übergeben,damit dann dort aus dem objekt die strings genommen werden.
das sieht im programm ungefähr so aus:

aufruf:
unterklasse_deutsch u = new unterklasse_deutsch();
new Frame(u);

hauptprogramm:

import....
....
public Frame extends JFrame .......

public Frame(Oberklasse_fuer_sprache sprache) {
....
...
nun will ich die strings so auslesen:

sprache.string1
sprache.string2
.....
das problem ist,daß nicht aus der erbendenklasse "gelesen" wird,sondern immer aus der oberklasse.
in der oberklasse sind alle strings deklariert,aber nicht initialisiert.trozdem wird dies akzeptiert und im prinzip ein leerer string genommen.an der stelle im programm steht dann nichts,das entsprechende menu/button/etc.ist aber vorhanden und benutzbar.

bitte sehnsüchtig um anregung und tips&triks.falls ich das problem zu undeutlich/etc. dargestellt haben sollte fragt einfach nach.ich kann nur leider nicht das ganze programm posten,weil das "etwas" viel wäre...

gruß matthias :-)

bei Antwort benachrichtigen
(Anonym) Matthias! „Java Problem...objekte und JFrame+vererbung....“
Optionen

ich verstehe das problem zwar nicht ganz, aber heir ein paar tipps von mir zur vererbung und objektorintierung:

höchst illegal ist schon mal der zugriff auf die variable einer klasse - auch wenn diese als public deklariert ist.
in der klasse sollten zwei Methoden existieren "getString1()" und "setString1()" zum Setzen und Auslesen der
Variablen. Das hat nix mit Pingelei zu tun, sondern das findest du in jeder Anleitung zu Objektorientierung unter
"Kapselung".

mit den Ober und Unterklassen: so geht es garantiert (es sei den, ich habe das Problem missverstanden)

public abstract class OberKlasse{
private String1;
public void setString1(String was){
String1=was
}
public String getString1(){
return String1
}
}

public class KlasseEinerSprache extends OberKlasse{

}

im main Programm

KlasseEinerSprache test=new KlasseEinerSprache();
test.setString1("hallo");
System.out.println(test.getString());


hoffe, das war ne Hilfe
ka

bei Antwort benachrichtigen
Matthias! (Anonym) (Anonym) „ich verstehe das problem zwar nicht ganz, aber heir ein paar tipps von mir zur...“
Optionen

hi,
danke dir erstmal,daß du geschrieben hast.ich hatte fast nicht erwartet eine antwort zu bekommen.
das problem ist ja eigentlich,das ich irgendwie beim aufruf des hauptframes einen parameter übergeben muß,bzw.irgendwo ablegen kann,damit im hauptframe der entsprechende konstruktor für die erbende klasse gesetzt wird.machen ich irgendeine if abfrage,habe ich das problem,das daß ganze nur für die if abfrage gilt,und außerhalb kennt "kein schwein mehr meine klasse in der ich die strings habe".trozdem zur vererbung innerhalb der klassen,wo die strings liegen,kann ich was von deinen tips verwenden.
falls du noch mal reinschaust:
hast du noch eine idee,wie ich es hinbekommen kann,je nach dem welchen button der benutzer klickt,den entsprechenden konstruktor im hauptfenster zu setzen(deklarieren+initialisieren)....
es wäre echt toll,wenn du noch eine idee hättest.

schönen abend und gruß

matthias

p.s.ich hatte gedacht,bei dem aufruf könnte ich dem konstruktor quasi eine instanz meiner "sprachklasse" mitgeben....geht wohl nicht,oder?

bei Antwort benachrichtigen
(Anonym) Matthias! (Anonym) „hi,danke dir erstmal,daß du geschrieben hast.ich hatte fast nicht erwartet eine...“
Optionen

hallo,

?? Da kann es eigentlich weiter kein Problem geben.
Nehmen wir ein Bsp:
Du hast ein Fenster, das "Abbrechen"-Button soll seine Beschriftung aus deiner Sprachklasse holen,
-> also "Cancel" oder "Abbrechen" je nachdem ob Deutsch oder Englisch.

Benutzer entscheidet sich im ersten Fenster für Deutsch:
OberKlasse test= new KlasseDeutsch();

dann Übergabe dieser Referenz im Konstruktor deines Hauptfensters.
im Konstr. des Hauptfensters weißt du diese Referenz einer private-Variable (vom Typ OberKlasse) des Hauptfensters zu,
nennen wir diese referenz "sprache"

dann bekommst du beim Zugriff auf "sprache.getString1()", was meinetwegen die Beschriftung für das Button
ist, "Abbrechen" zurückgeliefert.

schreib, falls ich mich irren sollte

wenn du später noch mal Konkret wissen willst, was für eine Sprache gerade verwendet wird, deklariere in
OberKlasse folgendes:

public abstract String getSprache();

damit sind die Sprachklassen verpflichtet, diese zu implementieren:

public String getSprache(){
return "Deutsch"
}

auf gutes gelingen, ka

bei Antwort benachrichtigen
Matthias! (Anonym) „hallo,?? Da kann es eigentlich weiter kein Problem geben.Nehmen wir ein Bsp:Du...“
Optionen

hey,
also es funktioniert jetzt fast,ich bekomme allerdings nun beim aufruf des hauptframes ein StackOverflowError......
kannst du erklären,warum daß der fall ist.bin gerade dabei,nachzuschauen...
in der api 1.2/1.3 dokumentation steht:
"Thrown when a stack overflow occurs because an application recurses too deeply"
ich verstehe noch nicht ganz,wieso das bei dieser anwendung der fall ist...
p.s.:ich habe alle strings als private deklariert und für jeden eine gleichnamige methode hinzugefügt.dadurch mußte ich nur klammern bei den aufrufen ergänzen.

bei Antwort benachrichtigen
(Anonym) Matthias! „hey,also es funktioniert jetzt fast,ich bekomme allerdings nun beim aufruf des...“
Optionen

eine gleichnamige methode wie die variable?
wenn du das so gemacht hast, bekommst du einen stackoverflow:

private String test="hallo";

public String test(){
return test();
}

du rufst dann unendlich die methode test auf - der compiler gibt keinen fehler, da du ja offenbar eine methode
aufrufst, die einen string zurückgibt - bloß das ist eine endlosrekursion bzw. -schleife

richtig muss die methode so aussehen
public String test(){
return test;
}

es ist "unschön", variablenname gleich methodennamen zu setzen

mfg ka

bei Antwort benachrichtigen
Matthias! (Anonym) „eine gleichnamige methode wie die variable?wenn du das so gemacht hast, bekommst...“
Optionen

ich glaubs nicht,in zwei fällen wurde tatsächlich rekursiv aufgerufen.du hast recht,es ist nicht nur unschön,sondern es entstehen leicht solche fehler.aber sonst müßte ich ja noch viel mehr quer durchs programm ändern.ich hatte vermutet,daß es einfach zu viele methoden sind(es sind ja 3*ca.200 + ~200).ich mach daß jetzt gleich mal und ich glaube jetzt müßte es gehen....

mal schauen....

bei Antwort benachrichtigen
Matthias! Nachtrag zu: „ich glaubs nicht,in zwei fällen wurde tatsächlich rekursiv aufgerufen.du hast...“
Optionen

so,daß geht!super...
warum allerdings nicht einfach direkt auf die variablen zugegriffen werden kann,geht immer noch nicht in meinen kopf rein :-)

ich danke dir vielmals...

gruß matthias!

bei Antwort benachrichtigen