Toon posts:

[java]geen layout kunnen bepalen in panel

Pagina: 1
Acties:

Verwijderd

Topicstarter
inleiding
Wij (ik en klasgenoot) proberen hier in java een applet te maken waarmee we in een nieuw scherm komen na het drukken van een knop.

Na een tijdje kwamen we tot het besluit om gebruik te maken van panels.

probleemomschrijving
Wanneer we in een panel een knop toevoegen krijgen we deze te zien in het panel.
We willen echter ook bepalen waar de knop op het scherm komt te staan, dus we beginnen met setLayouy( null ); en vervolgens met setBounds(int, int, int, int);
Vervolgens zagen we helemaal geen knop meer.
Het lijkt wel of panels niet met bounds wil werken.

Na tig dingen proberen en wat zoeken vond ik iets wat LayoutManager heet.
Dit werkte met GridBagLayout en een GridBagConstraint.
Affijn, ik heb wat code overgenomen van voorbeelden en op de site van sun gezocht wat je allemaal in die Constraints weg moet zetten (en ik hoop dat ik dat goed heb begrepen) , maar nu krijg ik "Applet not initialized".

Zie de code hieronder:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class View extends Panel {
  private CardLayout cardlayout;  // referentie naar CardLayout
  
  GridBagLayout gridbag = new GridBagLayout();
  GridBagConstraints c = new GridBagConstraints();
  
  public View() {
   cardlayout = new CardLayout();
   setLayout( cardlayout );

    // Maak de tweede kaart
    Panel kaart2 = new Panel();
    setLayout( gridbag );
    cc.gridx = 20; //coördinaat linkerkant
    c.gridy = 20; //coördinaat bovenkant
    c.gridwidth = 7; //is aantal kollomen
    c.gridheight = 7; //is aantal rijen
    c.fill = GridBagConstraints.BOTH; //zorgt ervoor dat het component zowel 
                         // horizontaal als verticaal wordt aangepast
    //default anchor is Center   
    c.weightx = 0.25;//ruimte tussen colommen
    c.weighty = 0.25;    kaart2.setFont( new Font( "Serif", Font.BOLD, 16 ) );
    Button knopje = new Button( "knop1"); 
    gridbag.setConstraints( knopje, c );
    kaart2.add( knopje );


Ik heb al aardig wat gegoogled en ook de search gebruikt.
Is het soms niet mogelijk om in een panel setLayout(null); te gebruiken en vervolgens voor al je knoppen de bounds te specificeren?
Zo nee, wat doe ik dan fout met die LayoutManager (let wel dat ik 2 uur geleden het woord voor het eerst las).

Zoals je wellicht al doorhebt. We zijn beginnelingen op het gebied van Java :).

[ Voor 2% gewijzigd door Verwijderd op 12-03-2003 15:49 . Reden: Layout van dit forum maar iets minder verneuken ]


Verwijderd

Java:
1
2
Panel kaart2 = new Panel();
setLayout( gridbag );


Je zet hiermee de layout voor de applet, niet voor je kaart2 panel. Je wilt dit neem ik aan:

Java:
1
2
Panel kaart2 = new Panel();
kaart2.setLayout( gridbag );


En in principe is GridBagLayout de "moeilijkste" layout die er is. Dus als je begint met Java zou ik een andere kiezen. Standaard wordt een FlowLayout gebruikt. Gebruik de API's op java.sun.com, dat is zeker handig :)

[ Voor 31% gewijzigd door Verwijderd op 12-03-2003 15:58 ]


  • kasper_vk
  • Registratie: Augustus 2002
  • Laatst online: 08-04-2025
Wellicht een onderschattende vraag, maar toch:
heb je het knopje zichtbaar gemaakt d.m.v. "knopje.setVisible( true );" ?

The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny...'


Verwijderd

Topicstarter
Dennis, bedankt. Het werkt !
Nu is alleen de knop net zo groot als het hele panel, maar ik ga weer even verder kloten :)

Verwijderd

Maar een Button op een Panel kan veel makkelijker hoor. Probeer eerst gewoon een Applet te maken zoals hieronder:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class ButtonTest extends Applet
{
     private Button button;
     private Panel panel;

     public void init()
     {
         button = new Button("Klik op me"); //nieuwe button 
         panel = new Panel(); //nieuwe panel
         panel.add(button); //button toevoegen aan panel
         this.add(panel);  //panel toevoegen aan Applet
     }
}


Ga eens een Applet tutorial lezen op de sunsite :)
Succes ermee

Verwijderd

Verwijderd schreef op 12 March 2003 @ 15:58:
Dennis, bedankt. Het werkt !
Nu is alleen de knop net zo groot als het hele panel, maar ik ga weer even verder kloten :)
Dat zit hem dus in je constraints van je GridBagLayout...for now: vergeet de GridBagLayout :) Komt later wel :)

Verwijderd

Topicstarter
Ja, waar we mee zitten is het positioneren van de knop. Dus hoe zeggen we waar de knop komt te staan op het scherm.

Ik was ondertussen weer even verder aan het kloten en ik had c.fill = GridBagConstraints.BOTH; eruit gehaald,zodat de knop niet meer het hele scherm vult, maar netjes in het midden staat.

Ik heb ontdekt dat ik de knop met c.anchor - GridBagConstraints.WEST aan de linkerkant krijg. Ik kan dus de knop nu dus links, linksboven, boven, midden, rechtsboven.. enz. krijgen.

Maar kun je ook precies bepalen waar hij moet komen te staan?
Want een knop kregen we wel op het scherm, maar er moeten nog meer knoppen bij en tekst e.d., dus we wilde aangeven waar die knoppen moeten komen staan.

Verwijderd

Topicstarter
Ja, we zijn eruit.
setLayout( null ); en dan de bounds bepalen van elke knop werkt nu natuurlijk wel als we er kaart2.setLayout( null ); van maken.

Alleen doen we het nu dus weer met setBounds, op zich niet erg, want zo'n LayoutManager hadden we toch nooit gehad, maar ik ben nu wel benieuwd geworden wat de mogelijkheden en voordelen van zo'n LayoutManager zijn, maar dat zal ik zelf verder wel uitzoeken. Het belangrijkste is dat we nu verder kunnen :)

Bedankt voor je hulp.

Onze fout was dus eigenlijk heel simpel, we moesten de layout van het panel resetten en niet die van de applet. Inmiddels weet ik nu weer van alles van LayoutManagers :)

[ Voor 19% gewijzigd door Verwijderd op 12-03-2003 16:30 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het voordeel van een layout manager is dat hij je layout managed. Dit is vooral handig als je schermen hebt die geresized kunnen worden.
Als je dan namelijk geen layout manager gebruikt zul je telkens al je componenten moeten verplaatsen en/of resizen. Dit is dus iets wat een LayoutManager voor je doet ( Mits goed geconfigureerd natuurlijk ). Voor simpele programmatjes die je niet kunt resizen is het daarom ook vaak niet nodig dat je een LayoutManager hebt aangezien het niet zoveel werk is om zelf even de bounds van je components te zetten.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Ok, ik snap het. Dan houd ik het voor nu maar bij setBounds :) Bedankt voor al jullie antwoorden. Wij komen er nu wel uit (hoop ik)
Pagina: 1