Toon posts:

[Java] componenten toevoegen vanuit andere class

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heb een class CreateLayout, waarbij ik allerlei componten als buttons enzo aanmaak..

Deze had ik eerst in mijn hoofdklasse staan, maar wilde het toch apart doen om de code een beetje schoon te houden en te scheiden..

Allemaal leuk en aardig, maar ik krijg het niet voor elkaar om nu de componenten daadwerkelijk op mijn JPanel te krijgen.

Eerst deed ik het gewoon met:
Java:
1
2
3
JButton btn = new JButton("Klik");
btn.setBounds(0, 0, 100, 20);
add(button);


Nu staat deze code dus in CreateLayout en probeer alles wat aangemaakt wrodt in deze class nu toe te voegen aan mijn applicatie met
Java:
1
add(new CreateLayout());

Maar dat werkt dus niet, want hij start de app niet meer op en krijg deze foutmelding:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Wat doe ik fout? Of hoe kan ik er voor zorgen dat ik vanuit CreateLayout toch de componenten te zien krijg??


dat werkte prima, maar ik mijn CreateLayout klasse kan hij blijkbaar het onderliggende panel niet meer vinden, want de applicatie start

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Doe je wel ergens frame.pack() oid?
edit: validate
Note: If a component has been added to a container that has been displayed, validate must be called on that container to display the new component. If multiple components are being added, you can improve efficiency by calling validate only once, after all the components have been added.

[ Voor 83% gewijzigd door zwippie op 12-05-2005 13:56 ]

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Laat ik me eerst eens "zorgen" gaan maken over die exceptie. Als ik de source van CreateLayout() bekijk, dan zie ik dat hij afgeleid is van "MainPanel" (wat -hoop ik- een afgeleide is van een JPanel). Waar heb je die "add(new CreateLayout())" staan? Die exceptie doet bij mij het vermoeden opwekken dat je een recursie in je app. hebt zitten...

P.S.: ik zie dat je op elk component de bounds aanpast; dat zal je app. visueel ongetwijfeld erg "nifty" eruit laten zien, maar laat de gebruiker nogal beperkt in het correct resizen van het window...

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


Verwijderd

Topicstarter
ik heb nu validate(); toegevoegd aan zowel mijn hoofdklasse als aan CreateLayout, maar het heeft geen effect..

Verwijderd

Topicstarter
die add(createLayout) staat in MainPanel, wat idd een verlengde is van JPanel..
P.S.: ik zie dat je op elk component de bounds aanpast; dat zal je app. visueel ongetwijfeld erg "nifty" eruit laten zien, maar laat de gebruiker nogal beperkt in het correct resizen van het window...
Dit klopt idd wel, maar heb nog niet de tijd genomen om me te verdiepen in layoutmanagers.. mocht iemand nog een tip hebben over hoe ik zo'n absoluut gepositioneerde layout om kan zetten naar een mooie layoutmanager (zodat alles wle opm dezelfde plek staat zoals nu) dan zou dat erg aardig zijn ;)

  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Verwijderd schreef op donderdag 12 mei 2005 @ 14:30:
die add(createLayout) staat in MainPanel, wat idd een verlengde is van JPanel..
Ja, dan is het nogal logisch: je extend MainPanel in je CreateLayout() class, en roept in z'n parent zijn eigen creatie aan! Ofwel: laat CreateLayout() direct van JPanel afleiden, of plaats die "add(new CreateLayout())" ergens anders (buiten de MainPanel)...

Voor wat betreft layout managers, ik denk dat dit document wel handig voor je is:
http://java.sun.com/docs/books/tutorial/uiswing/TOC.html

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


Verwijderd

Topicstarter
ok.. CreateLayout() leidt nu direct af van JPanel, en de app. runt nu gewoon.. maar alleen staan de componenten die gecreëerd zijn in CreateLayout niet in de app..

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Roep je de validate functie wel aan? Zie ook zwippie's reactie.

Verwijderd

Topicstarter
ja.. ik roep validate(); zowel in MainPanel als in CreateLayout aan..

Verwijderd

Ik wil wel even opmerken dat CreateLayout geen goede naam is voor deze klasse. CreateLayout is meer een naam voor een methode omdat er een werkwoord in zit :)

Verwijderd

Topicstarter
Bedankt voor de opmerking.. ik zal de naam veranderen, maat het lijkt me sterk als darmee het probleem opgelost is :P

Verwijderd

Topicstarter
Goed.. ik heb nog het een en ander lopen klooien en hij doet het nu wel.. Ik heb het op de volgede manier gedaan:

In MainFrame wordt een nieuw MainPanel aangemaakt, waarbij ik de Container meestuur.
Java:
1
contentPane.add(new MainPanel(contentPane)); // contentPane is de Container


In MainPanel wordt Layout (heb de naam veranderd ;)) aangeroepen en stuur nu ook de Container mee:
Java:
1
add(new Layout(pane)); // pane is de Container


in Layout worden nu de componenten toegevoegd dmv:
Java:
1
2
Container c = pane;
c.add(btn);
Daarmee komen de componenten wel op het scherm, dus lijkt het probleem opgelost.. Weet niet of dit een officiële oplossing is, maar het werkt igg wel.

Maar nu het volgende:
Als ik nu zo'n button aanklik. Hoe vang ik dan het evnt op, zodat ik MainPanel er mee verder kan werken?? Want heb momenteel mijn ActionPerformed() in MainPanel staan en wilde dat eigenlijk ook zo houden. Of moet ik het totaal anders aanpakken??

[ Voor 4% gewijzigd door Verwijderd op 13-05-2005 09:55 ]

Pagina: 1