# labeltext ändert sich nicht



## Guest (30. Jul 2008)

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

```
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


----------



## Gast2 (30. Jul 2008)

ich weiß nicht was deine setLabel macht...
aber du kannst ein board.validate() mal versuchen


----------



## Guest (30. Jul 2008)

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 

```
board.label.setText("neuer labeltext");
```

validate will auch nicht :<


----------



## Verjigorm (30. Jul 2008)

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??


----------



## SlaterB (30. Jul 2008)

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


----------



## Guest (30. Jul 2008)

ohja das klingt logisch=)
hab jetzt das label und die setLabel() static gemacht und es funzt.

danke


----------



## Verjigorm (30. Jul 2008)

edit: mist zu spät


----------



## SlaterB (30. Jul 2008)

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


----------



## Guest (30. Jul 2008)

es wird zwar kein 2tes board panel geadded.. aber wie mach ich es nun dann "richtig".. ich steh aufm schlauch


----------



## SlaterB (30. Jul 2008)

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


----------



## Gast2 (30. Jul 2008)

wenn es immer nur ein Board geben wird kannst du auch eine Singelton machen...


----------



## FArt (30. Jul 2008)

SirWayne hat gesagt.:
			
		

> wenn es immer nur ein Board geben wird kannst du auch eine Singelton machen...



Kein Kommentar  :shock: 

Nicht ein neues Label anlegen, sondern das bestehende manipulieren.
Tipp: nicht blind loslegen, Tutorial lesen und lernen: http://java.sun.com/docs/books/tutorial/uiswing/components/label.html#contentsapi


----------



## Gast2 (30. Jul 2008)

was dein prob?????? wenn er nicht mehr wie ein board erzeugen will und das immer wieder ändern möchte...


----------



## Verjigorm (30. Jul 2008)

Singletons sind hier im Forum leicht verpöhnt


----------



## Gast2 (30. Jul 2008)

okay kann ich ja net riechen^^...
und why???


----------



## SlaterB (30. Jul 2008)

lies dir z.B.
http://www.java-forum.org/de/viewtopic.php?t=70812
durch


----------



## Guest (30. Jul 2008)

so.. zweiter versuch.

hab es jetzt folgendermaßen .. und zwar in der frame klasse steht

```
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 :>


----------



## SlaterB (30. Jul 2008)

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


----------



## Verjigorm (30. Jul 2008)

dann übergib doch referenzen der Klasse im Konstruktor ...

Stichwort wäre auch Design Patterns:
http://www.java-forum.org/de/viewtopic.php?t=6090#28848


----------



## Guest (30. Jul 2008)

Verjigorm hat gesagt.:
			
		

> dann übergib doch referenzen der Klasse im Konstruktor ...


ja das hab ich auch gemacht ... siehe post oben


danke nochma für eure hilfe/erklärungen -solved-


----------



## Verjigorm (30. Jul 2008)

Anonymous hat gesagt.:
			
		

> Verjigorm hat gesagt.:
> 
> 
> 
> ...



machen != verstehen


----------



## FArt (30. Jul 2008)

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.


----------



## Gast2 (30. Jul 2008)

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...


----------



## Wildcard (30. Jul 2008)

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.


----------



## SlaterB (30. Jul 2008)

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


----------



## Gast2 (30. Jul 2008)

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 =)???


----------



## SlaterB (30. Jul 2008)

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


----------



## Gast2 (31. Jul 2008)

ja stimmt das ist schon klar ^^...


----------



## FArt (31. Jul 2008)

SirWayne hat gesagt.:
			
		

> wenn er in seinem gesamten programm nur eine instanz von board will ist es für mich ein singelton...



Nein, das ist eine Instanz.

http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)
Dein "Anwendungsfall" ist der erste Punkt unter den Nachteilen.


----------

