-
Notifications
You must be signed in to change notification settings - Fork 88
GUI (Dutch)
Talen: Engels (English)
GUIs zijn het belangrijkste gedeelte van het framework en het beginpunt for elk paneel en inventaris. De GUI is altijd het hoogste gedeelte van de inventaris. Eén GUI heeft dezelfde eigenschappen voor elke persoon die deze bekijkt. Als twee spelers dezelfde GUI bekijken en je verandert de titel van de GUI, zullen beide spelers de nieuwe titel zien. Als je wilt dat het gedrag van een GUI verschillend is voor elke speler, moet je voor elke speler een andere GUI maken.
Oké, laten we kijken hoe je GUIs maakt.
Om een GUI te maken, maak je simpelweg een nieuw ChestGui
object. De ChestGui
heeft twee parameters. De eerste is het aantal rijen dat de GUI heeft en de tweede is de titel van de GUI.
Zie hoe de GUI het aantal rijen die de GUI heeft verwacht, niet het aantal slots. Waar je normaal gesproken 36 slots zou specificeren, specificeer je nu 4 rijen.
ChestGui gui = new ChestGui(5, "Mijn GUI");
Dit maakt een GUI met 5 rijen en een titel die zegt "Mijn GUI". Je kan ook componenten van Adventure gebruiken voor de titel. Om dit te doen, stop je Component
in een ComponentHolder
via ComponentHolder.of
en gebruik deze als titel voor de gui.
Alhoewel je misschien andere soorten guis wil maken dan kisten is het aan te raden om eerst deze pagina te volgen als je onbekend bent met dit framework. Daarna kan je zien hoe je andere soorten guis maakt.
Houd er rekening mee dat dit het aantal rijen is voor de bovenste helft van de inventaris, de vier rijen in het onderste gedeelte zijn niet inbegrepen in dit aantal.
Als je het aantal rijen of de titel wil veranderen kan je setRows
en setTitle
aanroepen (resp.).
Na elke functie-aanroep op een GUI of paneel moet je handmatig de GUI bijwerken.
Er zijn ook functies om het aantal rijen en de titel te krijgen: getRows
en getTitle
respectievelijk.
Om de gemaakte gui aan een speler te laten zien kan je Gui#show
aanroepen met de speler aan wie je de gui wilt laten zien.
gui.show(deSpeler);
Als je verandering maakt aan een gedeelte van de GUI, moet je deze bijwerken. Dit kan je doen door update
op het GUI object aan te roepen om de GUI bij te werken voor elke speler die deze bekijkt. Als je de gui niet update na deze te wijzigen kan de gui mogelijk niet meer correct werken.
gui.update();
Je kan specificeren wat er moet gebeuren als een speler op de GUI klikt en wat er gebeurt als ze deze sluiten. Dit kan je doen door setOnTopClick
, setOnBottomClick
, setOnGlobalClick
en setOnClose
aan te roepen. Allen nemen een Consumer met een InventoryClickEvent en een InventoryCloseEvent respectievelijk.
gui.setOnTopClick(event -> {});
gui.setOnBottomClick(event -> {});
gui.setOnGlobalClick(event -> {});
gui.setOnOutsideClick(event -> {});
gui.setOnClose(event -> {});
Gebruik deze functies niet voor klikken op individuele items; er zijn veel makkelijkere manieren om dit te doen die later worden uitgelegd.
Het verschild tussen de verschillende soorten klik is als volgt. Boven- en onderkant worden alleen aangeroepen wanneer de speler op de bovenste of onderste helft klikt respectievelijk. Globale klik wordt aangeroepen zolang je in de inventaris klikt. Buiten-klik wordt aangeroepen als je buiten de inventaris klikt.
Hetzelfde systeem dat gebruikt wordt voor klikken bestaat ook voor slepen. De enige uitzondering hierop is dat er geen buiten-sleep is omdat items niet buiten de gui kunnen worden gesleept. Als het slepen door zowel de boven- als de onderkant gaat worden zowel de boven- en onderkant aangeroepen. Dit in tegenstelling tot het klikken waarbij de boven- en onderkant niet beiden voor dezelfde klik kunnen worden aangeroepen.
gui.setOnTopDrag(event -> {});
gui.setOnBottomDrag(event -> {});
gui.setOnGlobalDrag(event -> {});
Als je wilt, voor welke reden dan ook, kan je ook alle panelen, alle items en de inventaris zelf krijgen van de GUI.
Collection<Pane> panes = gui.getPanes();
Collection<GuiItem> items = gui.getItems();
Inventory inventory = gui.getInventory();
Als je een XML-bestand hebt gedefinieerd kan je deze inladen door load
aan te roepen op de Gui
klasse. Deze neemt drie parameters: de klasse waarin je de GUI wilt laden en de input stream die verwijst naar het XML-bestand.
ChestGui gui = ChestGui.load(this, myXMLFile);
Je kan in de code specificeren welk soort gui je wil (zoals hier is laten zien) of dit in het XML-bestand specificeren en dan kna je deze laden via
Gui.load
. Op de pagina voor andere soorten guis wordt uitgelegd hoe dit werkt.
Als je functies of velden hebt gespecificeerd die aangeroepen moeten worden moet je de klasse specificeren waarin deze functies en velden zijn. Dat is waar de eerste parameter voor is. Dit is bijna altijd de klasse waarin je werkt, dus als je niet zeker weet wat te doen, specificeer gewoon this
.
De tweede parameter is de InputStream naar je XML-bestand. Er is een ingebouwde functie in Bukkit om deze te krijgen, namelijk
InputStream inputStream = plugin.getResource("gui.xml");
Waar plugin
de hoofdklasse van je plugin is en de "gui.xml" de naame van je XML-bestand is.
Om een basis GUI te creëren in een XML-bestand voeg je het volgende element toe aan het bestand.
<gui/>
Als attributen moet je de rows
en title
attributen hebben. De rows
attribuut specificeert het aantal rijen die de GUI zal hebben en de title
attribuut specificeert de titel van de GUI.
<gui rows="5" title="Mijn GUI"/>
Je kan verschillende optionele attributen specificeren voor je GUI element. De eerste is field
. Met field
kan je een veldnaam specificeren in je code die geïnitialiseerd wordt met de GUI zodra het aan het laden is.
In het XML-bestand:
<gui rows="5" title="Mijn GUI" field="gui"/>
In de code:
ChestGui gui; //dit veld wordt geïnitialiseerd met de GUI
Je kan ook een onTopClick
attribuut specificeren. Hier kan je een functienaam specificeren die aangeroepen wordt zodra iemand op de bovenste helft van de GUi heeft geklikt.
In het XML-bestand:
<gui row="5" title="Mijn GUI" onTopClick="guiKlik"/>
In de code:
public void guiKlik(InventoryclickEvent event) {}
De gespecificeerde functie moet publiek zijn. De InventoryClickEvent
parameter is optioneel. Je mag een return type specificeren als je wilt, maar dit resultaat zal altijd worden genegeerd.
Je kan ook een onBottomClick
attribuut specificeren. Hier kan je een functienaam specificeren van een functie die wordt aangeroepen zodra iemand heeft geklikt op de onderste helft van de GUI.
In het XML-bestand:
<gui rows="5" title="Mijn GUI" onBottomClick="guiKlik"/>
In de code:
public void guiKlik(InventoryClickEvent event) {}
De functie gespecificeerd moet publiek zijn. De InventoryClickEvent
parameter is optioneel. Je mag een return type specificeren als je wilt, maar dit resultaat zal altijd worden genegeerd.
Dit attribuut specificeert een functienaam voor een functie die moet worden aangeroepen wanneer iemand in de bovenste of onderste helft van de GUI klikt.
In het XML-bestand:
<gui rows="5" title="Mijn GUI" onGlobalClick="guiKlik"/>
In de code:
public void guiKlik(InventoryClickEvent event) {}
De gespecificeerde functie moet publiek zijn. De InventoryClickEvent
parameter is optioneel. Je mag een return type specificeren als je wilt, maar dit resultaat zal altijd worden genegeerd.
Dit attribuut specificeert een functienaam voor een functie die moet worden aangeroepen wanneer iemand buiten de GUI klikt.
In het XML-bestand:
<gui rows="5" title="Mijn GUI" onOutsideClick="guiClick"/>
In de code:
public void guiKlik(InventoryClickEvent event) {}
De gespecificeerde functie moet publiek zijn. De InventoryClickEvent
parameter is optioneel. Je mag een return type specificeren als je wilt, maar dit resultaat zal altijd genegeerd worden.
Je kan een onClose
attribuut specificeren. Hier specificeer je de functienaam van de functie die wordt aangeroepen zodra iemand de GUI sluit.
In het XML-bestand:
<gui rows="5" title="Mijn GUI" onClose="guiSluit"/>
In de code:
public void guiSluit(InventoryCloseEvent event) {}
De gespecificeerde functie moet publiek zijn. De InventoryCloseEvent
parameter is optioneel. Je mag een return type specificeren als je wilt, maar dit resultaat zal altijd genegeerd worden.
Je kan een populate
attribuut specificeren. Hier specificeer je de functienaam van de functie die de populatie van de GUI overneemt tijdens het laden. Kindelementen die zijn gespecificeerd zullen worden genegeerd als dit attribuut is gespecificeerd.
In het XML-bestand:
<gui rows="5" title="Mijn GUI" populate="populeerGui"/>
In de code:
public void populeerGui(Gui gui) {}
Je mag een return type specificeren als je wilt, maar dit resultaat zal altijd genegeerd worden.