Skip to content
stefvanschie edited this page May 16, 2020 · 10 revisions

Talen: Engels (English)

Zoals ook gedeelte is uitgelegd op de IF pagina, zijn panelen subsecties van een GUI die items op een bepaalde manier tonen. Er kunnen zoveel panelen in een GUI zijn als je wilt.

Er zijn op dit moment vier ingebouwde panelen:

En vijf ingebouwde UI-elementen:

UI-elementen worden door het framework ook beschouwd als panelen.

Echter kan je ook zelf je eigen panelen maken dat hier wordt uitgelegd.

Elk paneel kan worden onderverdeeld in drie categorieën:

  • Panelen die items nemen
  • Panelen die panelen nemen
  • Panelen die niets nemen

Panelen die items nemen

Een paneel die items neemt zal deze items tonen aan de hand van de eigenschappen van het paneel. Dit is verschillend voor elk paneel.

Panelen die panelen nemen

Een paneel die panelen neemt zal elk paneel tonen relatief aan zijn eigen positie. Je kan zoveel panelen aan elkaar hangen als je maar wilt.

Panelen die niets nemen

Deze panelen werken op zichzelf en zijn allemaal UI-elementen. Ze gebruiken een ingebouwde stijl voor het tonen en hebben geen items of andere panelen nodig om ze te laten functioneren.


Elk paneel heeft eigenschappen. Een voorbeeld hiervan is de startlocatie. De startlocatie heeft een x- en y-waarde. Dit is de afstand van de hoek linksboven van de GUI tot de locatie van het paneel. Een locatie van (1,1) betekent dat het paneel één naar rechts en één naar beneden is gepositioneerd. Elk paneel heeft ook een lengte en een hoogte. De lengte is het aantal cellen die het paneel inneemt op de horizontale as. De hoogte is het aantal cellen die het paneel inneemt op de vertical as.

Elk paneel kan ook zichtbaar/onzichtbaar worden gemaakt, waarbij deze niet wordt getoond als deze onzichtbaar is. Je kan ook een klikeigenschap instellen die aangeroepen wordt wanneer iemand op het paneel klikt.

Panelen mogen (gedeeltes) van andere panelen overlappen. Hiermee kan je bijvoorbeeld achtergronden maken voor je GUIs. Om ervoor te zorgen dat de panelen worden getoond zoals jij wilt heeft elk paneel een prioriteit. Panelen met een lage prioriteit worden als eerst getoond en panelen met een hoge prioriteit worden als laatst getoond.

Er zijn zes prioriteiten, gebaseerd op de EventPriority van Bukkit's systeem:

  • Lowest
  • Low
  • Normal
  • High
  • Highest
  • Monitor - Monitor moet niet in productie worden gebruikt en alleen worden gebruikt om dingen te testen.

Om een paneel te maken roep je gewoon de constructor aan voor het paneel met de benodigde parameters. Als voorbeeld gebruiken we StaticPane, maar je kan deze substitueren voor elk paneel.

StaticPane paneel = new StaticPane(0, 0, 9, 6, Pane.Priority.HIGH);

Dit creëert een paneel die in de hoek linksboven begint, een lengte van negen en een hoogte van zes heeft en een hoge prioriteit. De prioriteit parameter is optioneel.

Je kan de zichtbaarheid van het paneel veranderen door setVisible aan te roepen.

paneel.setVisible(false); //maakt het paneel onzichtbaar

Je kan ook zeggen wat er moet gebeuren als iemand op het paneel klikt.

paneel.setOnClick(event -> event.getWhoClicked().sendMessage("Je klikte!"));

En je kan de prioriteit aanpassen.

paneel.setPriority(Pane.Priority.LOW); //zet de prioriteit naar laag

Elke verandering die je doet aan het paneel wordt alleen getoond nadat je update op de onderliggende GUI aanroept.

Om het paneel toe te voegen aan de GUI, roep addPane aan op de GUI.

gui.addPane(paneel);

Panelen kunnen uitgerekt worden onder de rijen in de bovenste helft van de inventaris, naar de onderste helft van de inventaris: de spelers inventaris. Bedenk dat de onderste vier rijen onderdeel zijn van jouw inventaris; ze gedragen zich exact zoals elke andere rij in de GUI. Wanneer je een paneel in de onderste helft van de inventaris beweegt, wordt de inventaris van de speler gecachet en geleegd. Waar de speler normaal gesproken zijn inventaris nog kon zien wanneer de GUI geopend is, is deze nu leeg om ruimte te maken voor de panelen aan de onderkant. De inventaris van de speler wordt teruggezet zodra ze de inventaris sluiten of wanneer alle panelen die de onderkant van de GUI innemen weg zijn en de GUI is geupdatet. De reden voor deze ontwerpkeuze is as volgt: we willen dat de spelers onder normale omstandigheden hun inventaris zien. Dit kan nuttig zijn voor bijvoorbeeld handel-GUIs waar je specifiek items vanuit je inventaris in de bovenste helft moet doen. Deze functionaliteit is nu nog steeds haalbaar. De reden dat alle items worden weggehaald als een gedeelte van de onderste helft wordt ingenomen door panelen, is omdat het te lastig is om vast te stellen hoe andere items zich moeten gedragen in relatie tot andere panelen, in het geval van overschrijven, resetten, bewegen, slepen, etc. Dit is een oplossing waar de meeste gebruikers tevreden mee zijn. Mensen die willen dat hun spelers toegang hebben tot hun items kunnen dit nog steeds doen, terwijl mensen die dit niet nodig vinden gebruik kunnen maken van de extra vier rijen aan de onderkant.

XML

We maken opnieuw gebruik van StaticPane als een voorbeeld, maar je kan deze substitueren voor elk paneel. Om een paneel toe te voegen, voeg het paneelelement toe aan het GUI-element.

<staticpane/>

Je moet de lengte- en hoogteattributen instellen om het paneel te laten werken, zoals als volgt:

<staticpane length="9" height="6"/>

Optionele attributen

x en y attributen

De x- en y-attributen geven aan waar het paneel geplaatst moet worden. Sommig panelen, zoals het masonry pane bepalen dit zelf en zullen deze overschrijven. Als deze attributen niet zijn gespecificeerd, zal het paneel ze automatisch naar 0 zetten voor beide coördinaten.

<staticpane x="0" y="0" length="9" height="6"/>

field attribuut

Met field kan je een veldnaam specificeren in je code die wordt geïnitialiseerd met het paneel zodra het aan het laden is.

In het XML-bestand:

<staticpane length="9" height="6" field="paneel"/>

In de code:

StaticPane paneel; //dit veld wordt geïnitialiseerd met het paneel

onClick attribuut

Je kan ook een onClick attribuut specificeren. Hier kan je de functienaam aangeven van de functie die wordt aangeroepen zodra iemand op het paneel klikt.

In het XML-bestand:

<staticpane length="9" height="6" onclick="paneelKlik"/>

In de code:

public void paneelKlik(InventoryClickEvent event) {}

De gespecificeerde functie moet publiek zijn. De InventoryclickEvent parameter is optioneel. Je mag elk return type specificeren die je wilt, maar het resultaat zal altijd worden genegeerd.

populate attribuut

Je kan een populate attribuut specificeren. Hier specificeer je de functienaam van een functie die de populatie van het paneel overneemt tijdens het laden. Elk kindelement toegevoegd aan het paneelelement zal worden genegeerd wanneer dit attribuut gespecificeerd is.

In het XML-bestand:

<staticpane length="9" height="6" populate="populeerPaneel"/>

In de code:

public void populeerPaneel(StaticPane paneel) {}

Je mag elk return type specificeren die je wilt, maar het resultaat zal altijd worden genegeerd.

priority attribute

Je kan de prioriteit van het paneel specificeren met het priority attribuut. De prioriteitwaarde moet volledig in hoofdletters zijn. Standaard is dit NORMAL.

In het XML-bestand:

<staticpane length="9" height="6" priority="LOW"/>

visible attribuut

Je kan het paneel zichtbaar/onzichtbaar maken door dit attribuut toe te voegen. De standaardwaarde is true.

In het XML-bestand:

<staticpane length="9" height="6" visible="false"/>
Clone this wiki locally