[Java]Overlapping van JPanels

Pagina: 1
Acties:

  • maxjuh
  • Registratie: November 2004
  • Laatst online: 19-03-2025
In mijn applicatie heb ik meerdere JPanels die JPanel extenden die ik allemaal toe voeg in een klasse die JFrame extend (gebruik geen layoutmannager maar voeg ze simpel toe door add(een jpanel). In De JPanels staan bijv JButtons, JLabels etc. Ook hebben veel JPanels een functie paint() die wat lijnen, vierkanten etc trekt met functies uit de klasse Graphics van awt.

Een aantal JPanels overlappen elkaar (tot nu toe allemaal omdat ik nog niet alle JPanels heb gemaakt omdat ik tegen dit probleem aan liep). Messchien handig om te vermelden dag ik gebruik maak van Observerable en Observer. Als er dan bijv op een JButton van een van de JPanels word gedrukt word er in een van de JPanels (of meerdere) onder andere de update() (de update functie word natuurlijk automatish aangeroepfunctie aangeroepen die een repaint() doet zodat er net ff iets anders word getekend.

Dit werkt alleen niet vlekkeloos. De ene keer is de volgorde waarop de JPanels elkaar overlappen goed en de volgende keer dat ik het programma start is het een zootje nadat ik op een JButton heb gedrukt.

Toen ben ik gaan zoeken of ik de JPanels een vaste waarde voor de overlapping kon geven en kwam ik met JLayeredPane waar ik de JPanels aan toevoegde: (het toevoegen gebeurd allemaal in de klasse die JFrame extend)

Java:
1
2
3
layer.add(lampPanel, 0);
layer.add(tubePanel, 1);
layer.add(doorPanel, 2);


Later voegde ik de layer toe aan de contentpane van de JFrame.

Dit hielp echter helemaal niks en ik zat nog steets met het zelfde probleem. Het is wel zo als ik tubePanel en de lampPanel verwissel van index dat ik de tubePanel de eerste keer niet zie, maar zie hem weer wel als ik op een JButton heb gedrukt (dan word er weer een repaint gedaan).

Wat ik verder nog heb geprobeerd is door niet paint te gebruiken maar paintComponent() uit Swing.

Java:
1
2
3
4
5
public void paintComponent(Graphics g)
{
       super.paintComponent(g);
                //..........
}



Ik denk zelf dat het iets te maken heeft met de repaint of de combinatie van awt en swing...?

P.S. heb dyslexie dus hoop dat het te begrijpen is

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 16-01 14:17
je uitleg is prima duidelijk, maar ik begrijp het probleem niet helemaal
volgens mij loop je tegen problemen aan dat de jpanels overlappen?
kun je misschien het probleem nog even wat duidelijker formuleren?

  • maxjuh
  • Registratie: November 2004
  • Laatst online: 19-03-2025
Ik zal het proberen met een plaatje erbij.

Afbeeldingslocatie: http://www.xs4all.nl/~benno2/microwave.jpg

In dit voorbeeld gebruik ik 2 JPanels die elkaar overlappen. De knop, het grote vierkant en de tekst zijn een JLabel, de deur. Het kleine vierkantje bovenaan met het rondje erin is de andere JLabel, een lamp (de jlabel is ook een stuk kleiner).

Als ik nu op de knop druk om de deur te openen voert de doorPanel een update() uit die repaint() aanroept. Omdat er iets veranderd is in een model word er dan niet de tekst CLOSE maar OPEN weergeven (tekst word geschreven met g.drawString). De doorPanel zet dan gelijk daarna de lamp aan waardoor de lampPanel ook een repaint() uitvoerd omdat die een update krijgd.

Als de lamp is aangezet (de lamp is aan als de deur open is en uit als die deur gesloten is) word het kleine vakje geel. Dan doe je de deur weer dicht en word de lamp weer gewoon grijs.

Het rare is dat dit de ene keer prima werkt maar de andere keer als je de deur opend zie je de hele lamp niet meer. De lamp zie je maar een paar ms. Hij vlikkerd als het ware ff naar de voorgrond en verdwijnd weer.

Hoop dat het zo duidelijk is :)..

edit: owja het is wel de bedoeling dat alle JPanel gescheiden blijven.

[ Voor 3% gewijzigd door maxjuh op 30-09-2006 12:28 ]


  • maxjuh
  • Registratie: November 2004
  • Laatst online: 19-03-2025
niemand?

  • Jochem Knoops
  • Registratie: November 2000
  • Laatst online: 25-11-2025
Nou je probleem is dat je geen LayourManager heb gedefineerd. Wat niet wil zeggen dat er geen gebruikt wordt. Bij een JFrame en een JPanel worden standaard (als ik het goed onthouden heb) een FlowLayout gebruikt.
Zoals jij je probleem omschrijft en getekend hebt zou ik zeggen gebruik een BorderLayout voor de verdeling van de Panels binnen het JFrame en gebruik bij de verschillende JPanels een FlowLayout.

Succes

  • maxjuh
  • Registratie: November 2004
  • Laatst online: 19-03-2025
Dan zal ik daar naar kijken. Ik doe altijd setLayout(null) om dan zelf de coördinaten te zetten

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 12-02 15:05

Robtimus

me Robtimus no like you

JochemKnoops schreef op dinsdag 03 oktober 2006 @ 08:57:
Nou je probleem is dat je geen LayourManager heb gedefineerd. Wat niet wil zeggen dat er geen gebruikt wordt. Bij een JFrame en een JPanel worden standaard (als ik het goed onthouden heb) een FlowLayout gebruikt.
Een JPanel heeft standaard een FlowLayout, de content pane van een frame heeft standaard een BorderLayout.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • maxjuh
  • Registratie: November 2004
  • Laatst online: 19-03-2025
Volgens mij werk ik in mijn geval ook helemaal niet met een Layout mannager. setlayout(null) zegt volgens mij juist dat je geen layout mannager wilt gebruiken (in dit geval niet de standaart layout mannager)

  • Jochem Knoops
  • Registratie: November 2000
  • Laatst online: 25-11-2025
Ik wist dat de contentpane een andere LayoutManager had, maar twijfelde over de JPanel en JFrame. Maar goed als je geen layoutmanager gebruikt is het dus aan de vm om te bepalen hoe en wat je op het scherm wilt hebben. Juist door die layoutmanagers kan je het zelf bepalen.

  • Kwistnix
  • Registratie: Juni 2001
  • Nu online
JochemKnoops schreef op dinsdag 03 oktober 2006 @ 14:44:
Ik wist dat de contentpane een andere LayoutManager had, maar twijfelde over de JPanel en JFrame. Maar goed als je geen layoutmanager gebruikt is het dus aan de vm om te bepalen hoe en wat je op het scherm wilt hebben. Juist door die layoutmanagers kan je het zelf bepalen.
Het "content pane" van een JFrame is een Container object wat default geïnitialiseerd is met een BorderLayout. Een JPanel wordt geïnitialiseerd met een FlowLayout.
Als je een default LayoutManager veranderd naar null dan worden er helemaal geen aannames gedaan over positionering van componenten. Je kan componenten wel zelf absoluut positioneren als je gebruikt maakt van de "null layout", d.m.v. de setBounds() methode van Component; doe je dat niet dan zijn je componenten niet zichtbaar. Dat absoluut positioneren is soms verleidelijk, maar geen best practice.

Edit: /spuit11, anders lees ik eerst even de overige replies door |:(

[ Voor 9% gewijzigd door Kwistnix op 03-10-2006 15:10 ]


  • maxjuh
  • Registratie: November 2004
  • Laatst online: 19-03-2025
Heel leuk allemaal maar het veranderen van de layout door een layoutmannager te gebruiken en dus niet de setBounds() methode gebruiken verhelpt mijn probleem dus blijkbaar niet?? (of zie ik dit fout) Ik kan wel bij elke verandering van een JPanel een repaint op de JFrame doen maar dat vind ik nou niet zo'n elegante oplossing.

[ Voor 3% gewijzigd door maxjuh op 03-10-2006 15:32 ]

Pagina: 1