XaGui Docs
Examples

Complete single-page menu

A copyable command menu with buttons, a border, and lifecycle events.

This class builds a fresh menu for each opening, which is a safe default when content may differ between players.

import eu.xap3y.xagui.GuiMenu;
import eu.xap3y.xagui.XaGui;
import eu.xap3y.xagui.models.GuiButton;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

public final class RewardsMenu {
    private final XaGui xaGui;

    public RewardsMenu(XaGui xaGui) {
        this.xaGui = xaGui;
    }

    public void open(Player player) {
        GuiMenu menu = xaGui.createMenu("&8Rewards", 3);

        menu.fillBorder(Material.GRAY_STAINED_GLASS_PANE);
        menu.addCloseButton();
        menu.setOpenSound(Sound.BLOCK_CHEST_OPEN, 0.7f);

        GuiButton reward = new GuiButton(Material.DIAMOND)
                .setName("&bDaily reward")
                .setLore("", "&7Click to claim", "&eOne diamond")
                .withListener(event -> {
                    Player clicker = event.getPlayer();
                    clicker.getInventory().addItem(new ItemStack(Material.DIAMOND));
                    clicker.sendMessage("§aReward claimed!");
                    clicker.closeInventory();
                });

        menu.setSlot(13, reward);
        menu.setOnClose(event ->
                event.getPlayer().sendMessage("§7Rewards menu closed."));
        menu.open(player);
    }
}

Create RewardsMenu once and call open(player) from your command executor or event listener.