Toon posts:

[JAVA] Kan geen layoutmanager gebruiken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb hier een aantal bestanden. Tot nu toe werkt alles prima, maar ik kan geen layout kiezen op de panels die ik toevoeg in de controller. In Controller.java staat setlayout(null). Ik krijg hierbij geen foutmelding, maar er wordt ook niks getoond op het scherm. Wanneer ik setlayout(null) weglaat, dan wordt de zooi wel getoond, maar alles naast elkaar. Ik heb een aantal andere layouts geprobeerd (oa SpringLayout) en die werken ook niet.

De bestanden:
LoginController
Controller
StartProgrammaGUI
GUI_Manager

StartProgrammaGui:
Start het programma en geeft het loginscherm. Hier moet je op inloggen.

LoginController:
Controleert de inlognaam en het wachtwoord goed is en toont vervolgens de GUI_Manager.

GUI_Manager:
Dit is een GUI met een aantal tabbladen. Het gaat om de panels die op de tabbladen staan. Daar kan ik geen layout op gebruiken.

Controller:
Deze toont de panels op de tabbladen. Hier probeer ik dus een layout (of setBounds) te gebruiken, maar dat gaat dus niet.

Hoe komt het nu dat ik geen layout kan gebruiken?

Verwijderd

aangezien je geen code geeft.. kan ik alleen maar gissen... Maar ik heb iets bijstaan dat je nadat je een layout selecteerd in je code dat je dan je panel of zoiets moet refreshen

Verwijderd

Hij geeft wel code (zie die links). Heb het even bekeken, volgens mij voeg je die panels niet toe aan een JTabbedPane maar aan de Controller klasse zelf wat slechts een JPanel is. Je maakt een JTabbedPane tbPanel aan, maar gebruik je die wel? Je moet de panels eigenlijk daar aan toevoegen.

Verwijderd

Topicstarter
Verwijderd schreef op 03 december 2003 @ 13:38:
Hij geeft wel code (zie die links). Heb het even bekeken, volgens mij voeg je die panels niet toe aan een JTabbedPane maar aan de Controller klasse zelf wat slechts een JPanel is. Je maakt een JTabbedPane tbPanel aan, maar gebruik je die wel? Je moet de panels eigenlijk daar aan toevoegen.
Jawel, dat doe ik wel. Wanneer ik alleen maar een button toevoeg, zonder een layout te gebruiken gaat het wel goed. Alleen dan kan ik niet alles goed neerzetten. Alle onderdelen komen dan naast elkaar.

[ Voor 8% gewijzigd door Verwijderd op 03-12-2003 13:43 ]


Verwijderd

* hier stond onzin *

:9

[ Voor 80% gewijzigd door Verwijderd op 03-12-2003 14:12 ]


Verwijderd

Oh, in GUIManager voeg je een JTabbedPane toe en daaraan voeg je dus instanties van Controller (wat een JPanel is) toe? Waarom maak je in Controller dan ook nog en TabbedPane aan?

En waarom maak je in Controller in de methode createWerknemerToevoegen()opnieuw een JPanel aan en voegt die toe aan Controller? Sorry, ik vind het niet allemaal erg duidelijk wat je in de code doet...

Verwijderd

Topicstarter
Verwijderd schreef op 03 december 2003 @ 14:22:
Oh, in GUIManager voeg je een JTabbedPane toe en daaraan voeg je dus instanties van Controller (wat een JPanel is) toe? Waarom maak je in Controller dan ook nog en TabbedPane aan?

En waarom maak je in Controller in de methode createWerknemerToevoegen()opnieuw een JPanel aan en voegt die toe aan Controller? Sorry, ik vind het niet allemaal erg duidelijk wat je in de code doet...
Die JTabbedPane die aangemaakt werd in Controller.java sloeg idd nergens op. Die stond er loos te wezen.

Wat betreft dat extra panel in Controller.java. Dat was puur een test, omdat de setLayout(null) niet werkte, dacht ik dat het misschien wel zou werken als we een heel nieuw panel toevoegden. Maar helaas, dat werkte dus ook niet...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je niet expliciet een LayoutManager aangeeft dan gebruikt hij de standaard LayoutManager. Dit is in dit geval een FlowLayout. Hierom komen de controls netjes van links naar rechts van boven naar beneden. Als je SetLayout( null ) doet dan zeg je dat er geen LayoutManager gebruikt moet worden. Je moet dan voor alle controls in je code opgeven hoe groot ze zijn en op welke x,y coordinaten ze staan. Als je dit dus niet doet zul je niks zien.

Je moet dus een LayoutManager kiezen die de layout bied die jij nodig hebt. Anders moet je zelf de componenten positioneren.

edit:

Nog even ter aanvulling. Ik zie dat je je componenenten die je op het panel

JPanel panel = new JPanel();

toevoegt wel positie en dimensie meegeeft. Echter het panel zelf geef je geen dimensies en voor je class Controler heb je geen LayoutManager gespecificeerd. Als je in je Controller constructor dit als eerste zet zal het denk wel werken

Java:
1
setLayout( new BorderLayout() );


en dan eventueel bij het toevoegen van je panel aan je Controller zeggen dat je in het CENTER wil toevoegen. Volgens mij hoeft dit niet en is CENTER al de standaard plek om een Component toe te voegen in een BorderLayout.

[ Voor 36% gewijzigd door Woy op 03-12-2003 15:53 ]

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


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

offtopic:

Het kan in ieder geval geen kwaad deze tutorial eens even goed door te nemen. Layout management in Java is een kunst apart en daar moet je je gewoon even goed over inlezen voor de ins en outs.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Het is me nog steeds niet gelukt. Ook niet mbv bovenstaande antwoorden.

Ik heb nu het volgende geprobeerd (programma kleiner gemaakt):

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
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;

public class GUI_Manager extends JPanel 
{
    private JTabbedPane tbPanel = new JTabbedPane();
    private static JFrame frame = new JFrame();

    public static void main(String[] args)
    {
        frame.setVisible(true);
        GUI_Manager gMan = new GUI_Manager();
    }
    
   public GUI_Manager() 
   {
        Tabblad tbWerknemers = new Tabblad("werknemers");
        tbPanel.setPreferredSize(new Dimension(500, 500));
        tbPanel.addTab("Werknemers", tbWerknemers);
        frame.getContentPane().add(tbPanel);
   }
}


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
26
27
28
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;

public class Tabblad extends JPanel
{
   private JPanel pnlWerknemers = new JPanel(new BorderLayout());

   public Tabblad(String tabbladNaam)
   {
        if (tabbladNaam.equals("werknemers"))
        {
            createTbWerknemers();
        }
   }

   public void createTbWerknemers()
   {
        JButton btn = new JButton("hijg");
        pnlWerknemers.add(btn, BorderLayout.LINE_START);
        add(pnlWerknemers);
   }

   public void createWerknemerToevoegen()
   {
   }
}


Er wordt nu nog steeds geen gebruik gemaakt van een layout terwijl ik dat wel heb aangegeven.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Je moet niet alleen adden met een laytoumanager, maar eerst de layout manager instellen op het component.

code:
1
2
3
4
JPanel panel = new JPanel();
panel.setLayout(newBorderLasyout());
panel.add(okButton,BorderLayout.CENTER);
panel.add(cancelButton,BorderLayout.NORTH)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Je bent je wel bewust van het feit dat je nou 2 verschillende JPanels hebt in Tabblad?

Namelijk in dit stukje:
Java:
1
2
3
4
public class Tabblad extends JPanel
{
   private JPanel pnlWerknemers = new JPanel(new BorderLayout());
}


op regel 1 en regel 3. De eerste wordt aangemaakt op het moment dat de superconstructor aangeroepen wordt, de tweede bij initialisatie van het object. Op deze regel:
Java:
1
pnlWerknemers.add(btn, BorderLayout.LINE_START);

voeg je echter iets toe aan "zichzelf", de descendant van JPanel. Wat je dus in het kort moet doen, is die private member skippen en de super constructor aanroepen met een new BorderLayout () als parameter.

Java:
1
2
3
4
5
public class TabPane extends JPanel {
   public TabPane () {
       super ( new BorderLayout () );
   }
}


De tips van mbravenboer uit de FAQ zijn helemaal zo gek nog niet hoor ;)
[...]
6. Gebruik Engelse namen om de code er homogeen uit te laten zien in combinatie met standaard API gebruik.
[...]
14. Roep altijd de super constructor aan.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Sorry, ik vat dat stukje over super nog niet helemaal en krijg het ook nog niet werkend. Hoe moet ik super toepassen zodat het wel werkt. Ik heb al gezocht op de werking en het gebruik van super, maar het wordt er voor mij niet duidelijker op.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Super in de constructor.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Persoon{
    private String _naam;

    public Persoon(String naam){
        _naam = naam;
    }

    //getters setters ed
}

class Werknemer extends Persoon{
      private String bedrijf;

      public Werknemer(String naam, String bedrijf){
            super(naam);
             _bedrijf = bedrijf;
      }
}


Super bij methode.

code:
1
2
3
4
5
6
7
8
9
10
11
class A{
     void bla(){System.out.println("snotje");}
}

class B extends A{
    void bla(){
         System.out.println("lekker");
         super.bla();
         System.out.println("gepeuterd?");  
    }
}

Verwijderd

Topicstarter
ok. dat gedeelte snap ik nog wel.

ik heb het geprobeerd op te lossen door:

code:
1
super ( new BorderLayout () );


en

code:
1
super.setLayout ( new BorderLayout () );


en

code:
1
pnlWerknemers.super ( new BorderLayout () );


maar ik weet gewoon niet hoe ik het hier moet toepassen. wat doe (en/of denk) ik nu verkeerd?

Verwijderd

Topicstarter
Het is gelukt.

Hier mijn code:

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
26
27
28
29
30
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;

public class Tabblad extends JPanel
{
   private JPanel pnlWerknemers = new JPanel(new BorderLayout());

   public Tabblad(String tabbladNaam)
   {
        super (new BorderLayout());

        if (tabbladNaam.equals("werknemers"))
        {
            createTbWerknemers();
        }
   }

   public void createTbWerknemers()
   {
        JButton btn = new JButton("hijg");
        pnlWerknemers.add(btn, BorderLayout.LINE_START);
        add(pnlWerknemers);
   }
   
   public void createWerknemerToevoegen()
   {
   }
}


Bedankt!

[ Voor 4% gewijzigd door Verwijderd op 04-12-2003 14:07 ]


Verwijderd

Topicstarter
Het gekke is alleen dat ik alleen maar de BorderLayout kan gebruiken. Wanneer ik een andere layout ga gebruiken wordt er niks getoond op het scherm. Hoe komt dit?

Wanneer ik het panel aanmaak gebruik ik new SpringLayout en bij super geef ik ook aan dat ik een SpringLayout wil gebruiken.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Daarvoor zul je toch echt die tutorial even door moeten nemen. Elke layout manager heeft zijn eigen karakteristieken en elke layoutmanager andere parameters bij het toevoegen van componenten aan de container.

Neem gewoon even de tijd de verschillende layoutmanagers in wat test progjes uit te proberen adhv van die link die ik eerder al postte om erachter te komen welke layoutmanager je in welk geval moet gebruiken. BorderLayout is iig maar zelden de handigste.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
drm schreef op 04 december 2003 @ 14:33:
Daarvoor zul je toch echt die tutorial even door moeten nemen. Elke layout manager heeft zijn eigen karakteristieken en elke layoutmanager andere parameters bij het toevoegen van componenten aan de container.

Neem gewoon even de tijd de verschillende layoutmanagers in wat test progjes uit te proberen adhv van die link die ik eerder al postte om erachter te komen welke layoutmanager je in welk geval moet gebruiken. BorderLayout is iig maar zelden de handigste.
Deze heb ik wel al doorgenomen. Ik krijg alles met een SpringLayout wel werkend op een scherm, maar niet in dit programma.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het heeft er denk mee te maken dat je class Tabblad al erf van JPanel en daar voeg je een JPanel aan toe ( Ik snap niet waarom je dat doet overigens, je kan ook gewoon meteen aan je class Tabblad je controls toevoegen ). Als je Tabblad geen layout manager heeft dan zal het panel pnlWerknemers niet getoond worden aangezien hier geen locatie en dimensie van bekend zijn.

Als je Componenten aan je Tabblad toevoegt en die de juiste layoumanager geeft en zorgt dat deze op een scherm toont zal het wel goed moeten werken.

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

Pagina: 1