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.
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