Menu with buttons update while open

This code example demonstrates how to create a menu with buttons that can be updated dynamically while the menu is open. It works for both menus with fill buttons and menus without fill buttons.

To open the menu, you can provide player and also location if several players shall have access to same menu or tied to specific location the menu.

To open the menu below
new MenuUpdateTime().menuOpen(final Player player);
new MenuUpdateTime().menuOpen(final Player player,final Location location);
public class MenuUpdateTime extends MenuHolderPage<Player> {

    private final MenuButton examplebutton;
    private final MenuButton examplebutton1;
    private final MenuButton forward;
    private final MenuButton previous;
    
    public MenuUpdateTime() {
        super(new ArrayList< >(Bukkit.getOnlinePlayers()));
        // Witch slot you want to fill with items in.
        setFillSpace("9-27");
        setMenuSize(45);
        setTitle("menu titel");
        setUpdateTime(5);
        examplebutton = new MenuButton() {
            @Override
            public void onClickInsideMenu(Player player, Inventory menu, ClickType click, ItemStack clickedItem) {
                //stuff you want to execute here, when clicking on item.
            }
            @Override
            public ItemStack getItem() {
                //Item you want this button return.
                return new ItemStack(Material.BLAZE_POWDER);
            }
        };
        examplebutton1 = new MenuButton() {
            @Override
            public void onClickInsideMenu(Player player, Inventory menu, ClickType click, ItemStack clickedItem) {
                //stuff you want to execute here when clicking on item.
            }
            @Override
            public ItemStack getItem() {
                //Item you want this button return.
                return null;
            }
        };
        previous = new MenuButton() {
            @Override
            public void onClickInsideMenu(final Player player, final Inventory menu, final ClickType click, final ItemStack clickedItem) {
                if (click.isLeftClick()) {
                    previousPage();
                }
            }
            @Override
            public ItemStack getItem() {
                return new ItemStack(Material.ARROW);
            }
        };
        forward = new MenuButton() {
            @Override
            public void onClickInsideMenu(final Player player, final Inventory menu, final ClickType click, final ItemStack clickedItem) {
                if (click.isLeftClick()) {
                    nextPage();
                }
            }
            @Override
            public ItemStack getItem() {
                return new ItemStack(Material.ARROW);
            }
        };
    }
    @Override
    public FillMenuButton < Player > createFillMenuButton() {
        FillMenuButton<Player> playerFullButton = new FillMenuButton<>((player, itemStacks, clickType, itemStack, playerFromList) -> {
            if (playerFromList != null) System.out.println("Clicked on player " + playerFromList.getName());
            return ButtonUpdateAction.THIS;
        }, (slot, player) -> {
            if (player == null) return null;
            
            LocalDateTime myObj = LocalDateTime.now();
            ItemStack itemStack = MenuMain.getInstance().getItemCreator().of(SkullCreator.itemFromUuid(player.getUniqueId()), String.valueOf(player), new ArrayList < > ()).makeItemStack();
            DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("HH:mm:ss");
            String formattedDate = myObj.format(myFormatObj);
            ItemMeta meta = itemStack.getItemMeta();
            if (meta != null) meta.setDisplayName(player.getName() + " " + formattedDate);
            itemStack.setItemMeta(meta);
            return itemStack;
        });
        
        playerFullButton.setUpdateButtonsTimer(true);
        playerFullButton.setUpdateTime(2 L);
        
        return playerFullButton;
    }
    @Override
    public MenuButton getButtonAt(int slot) {
        if (slot == 1) return examplebutton;
        if (slot == 5) return examplebutton1;
        if (slot == 42) return forward;
        if (slot == 38) return previous;
        return null;
    }
}

Last updated