labeltext ändert sich nicht

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hi,

ich bin grad am rumtesten mit swing und hab folgendes problem:

ganz vereinfacht gesagt:
1.fall: ich hab 2 klassen ... ein frame und adde und ein panel. dem frame adde ich das panel. auf dem panel isn button und nen label. wenn ich den button drueck dann aenderts den labeltext. -> das funzt

2.fall: nun hab ich 3 klassen.. wieder das frame und diesmal 2 panels.. die panels adde ich wieder dem frame. auf dem einen panel is nun der button und auf dem anderen nun das label. und wenn ich jetzt den button drueck aendert sich der labeltext nicht.

hier ausschnitt aus der klasse mit dem button
Code:
button[0].addActionListener(new ActionListener()
                                        {
                                            public void actionPerformed(ActionEvent e)
                                            {
                                                Board board = new Board(); //board is die klasse mit dem label
                                                board.setLabel("neuer labeltext); 
                                                //board.label.setText("neuer labeltext");                                                
                                            }
                                        }
                
        );
in setLabel aender ich also den text des labels mit dem string parameter


was muss ich machen .. hab rumprobiert mit updateUI, repaint usw..
wieso laeuft im 1.fall alles ohne probleme und im 2.fall aendert sich garnix 🙁


danke im voraus
 
ich weiß nicht was deine setLabel macht...
aber du kannst ein board.validate() mal versuchen
 
setLabel mach ich wie gesagt einfach nur nen label.setText().
aber selbst wenn ich direkt auf das label zugreif (label is public) dann funzt es nicht .. siehe im code die zeile die auskommentiert ist
Code:
board.label.setText("neuer labeltext");

validate will auch nicht :<
 
Board board = new Board(); //board is die klasse mit dem label

überleg mal was du hier machst?
Du legst nen NEUES Objekt Board an ....
Dieses Objekt existiert in deiner GUI wo?? 😉
 
du erstellst im ActionListener ein völlig neues Board,
das passt nicht zu der Idee, einen Text zu 'ändern'

um einen Text zu ändern, müsstest du bei einem vorhandenen Board etwas tut,
das neue Board ist höchstwahrscheinlich nicht in die GUI eingefügt
 
ohja das klingt logisch=)
hab jetzt das label und die setLabel() static gemacht und es funzt.

danke
 
also static als Lösung ist dann ja ganz schön daneben,
im Moment mag es funktionieren, aber damit verbaust du dir alle Möglichkeiten, etwa zwei Board-Panels im Programm zu haben
 
es wird zwar kein 2tes board panel geadded.. aber wie mach ich es nun dann "richtig".. ich steh aufm schlauch
 
das Board muss irgendwo gespeichert sein,

so wie die das Label vom Board mit getLabel() abfragst, muss auch das Board irgendwo per getBoard() erreichbar sein
 
wenn es immer nur ein Board geben wird kannst du auch eine Singelton machen...
 
was dein prob?????? wenn er nicht mehr wie ein board erzeugen will und das immer wieder ändern möchte...
 
so.. zweiter versuch.

hab es jetzt folgendermaßen .. und zwar in der frame klasse steht
Code:
board =  new Board();
controlpanel = new ControlPanel(board);
das funktioniert soweit auch

___________________________________________________________

mich würde aber noch folgendes interessieren
das Board muss irgendwo gespeichert sein,

so wie die das Label vom Board mit getLabel() abfragst, muss auch das Board irgendwo per getBoard() erreichbar sein
das boardpanel wird in der frameklasse erstellt. nun mach ich die getBoard() methode in die frameklasse. um aber von einer der panelklassen auf die getBoard() mehtode zugreifen zu können brauch ich wiederum ne instanz der frameklasse.. nun die hab ich ja wieder nicht.. also bin ich wieder da wo ich am anfang war !? ich check atm nicht durch... waer super wenn du mir das nochmal naeher erklaeren könntest :>
 
das ist doch genau die gleiche Sache nochmal:

1. getLabel() ist nicht lokal vorhanden sondern steckt in Board? -> dann brauchst du getBoard()

2. getBoard() ist nicht lokal vorhanden sondern steckt in Frame X? -> dann brauchst du getFrameX()

irgendwas muss vorhanden sein, irgendeine Zugriffsvariable und sei es das gesamte JFrame,
falls du dieses irgendwie zugreifbar hast, dann kannst du
getFrameX().getBoard().getLabel() aufrufen,
wenn du aber weder das Label, noch das Board, noch das JFrame oder irgendeine andere Indirektionsstufe hast, die du abfragen kannst,
ja dann ist das Label von diesem Listener aus nicht erreichbar,

statische Variablen als einfache Zugriffsmöglichkeiten ersparen natürlich kompliziertes Handling,
würde ich aber nur für wenige zentrale Objekte vorschlagen, die überall gebraucht werden, nicht für jedes billige Unterpanel (Board)

z.B. ist es weit weniger schlimm, das JFrame selber als statische Variable bekannt zu machen,
dann kannst du
FrameX.INSTANCE.getBoard().getLabel()
aufrufen, ein JFrame ist ja sehr wahrscheinlich nur genau einmal im Programm vorhanden

immer noch unschön, aber Board statisch ist unschöner 😉
 
SirWayne hat gesagt.:
was dein prob?????? wenn er nicht mehr wie ein board erzeugen will und das immer wieder ändern möchte...

... dann ist die Lösung kein Singleton... das ist der Mißbrauch eines durchaus sinnvollen Patterns für Leute, die es nicht richtig machen wollen... und weil es so oft mißbraucht wird, wird es auch wieder oft verteufelt und ist deshalb verpöhnt.
 
wenn er in seinem gesamten programm nur eine instanz von board will ist es für mich ein singelton...dann er kann er doch beliebig seine componenten darauf ändern(von dieser EINEN instanz)...

aber wie sehe war es ja nicht so gemeint...
 
SirWayne hat gesagt.:
wenn er in seinem gesamten programm nur eine instanz von board will ist es für mich ein singelton...dann er kann er doch beliebig seine componenten darauf ändern(von dieser EINEN instanz)...
Ein Singelton ist es, wenn nicht mehr als eine Instanz erlaubt ist, wenn man nicht mehr als eine benötigt, ist es defintiv kein Singelton.
 
bei eigenen Klassen von denen man nur ein Objekt benötigt, wäre jedes weitere Objekt schädlich allein schon aus Verwechslungsgründen,
von Codeunsauberkeit und minimaler Performance ganz zu schweigen,

per Definition möchte man daher immer auch weitere Objekte verbieten, das 'benötigt' wird automatisch zum 'erlaubt',
mir fällt jedenfalls spontan kein Grund ein, warum man die Lücke offen lassen sollte?

edit: der erste fällt mir ein:
man will sich die Arbeit dafür (privater Konstruktor usw) sparen, allein vom Zeitaufwand, als auch weil es den Code verschandelt
 
ok erlauben oder benötigen wir können ja alles auf die goldwaage legen...
wenn ich nur ein objekt benötige und nicht will das es mehrer davon gibt... erlaube ich doch auch nur eines oder???

und zum verschandeln wenn z.B. aus eclispe eine ResourceBundle klasse erstellt macht er auch einen private konstrukor weil er nur statische methode+attribute hat... ist das für dich dann auch verschandeln =)???
 
nene, für gewisse Klassen macht es ja gerade Sinn, da ist der zusätzliche Code praktisch auch die Doku zum Singleton,
die Betonung der Bedeutung der Klasse für das Gesamtprogramm,

aber wenn man ein einfaches JFrame hat, mehrere individuelle TeilPanel-Klassen, x Listener oder TableModel, die alle nur einmal verwendet werden,
dann schreibt man ja nicht bei jedem diese statische Methode,
allein schon weil sich der Aufwand nicht lohnt,

new MyFrame().setVisible(true);
und fertig
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben