Skip to main content

Get 25% OFF on your first order with BisectHosting using code "DAQEM"!

Input & Buttons

UI Lib provides wrappers around standard Minecraft widgets to make them easier to construct and more powerful.

Buttons

ButtonWidget

A standard vanilla Minecraft button with the default gray texture.

Constructor:

new ButtonWidget(int x, int y, int width, int height, Component label, OnPress onPress);

Example:

ButtonWidget btn = new ButtonWidget(10, 10, 100, 20, Component.literal("Save"), (b) -> {
saveData();
b.setMessage(Component.literal("Saved!"));
});

CustomButtonWidget

A button that uses your own custom textures instead of the vanilla gray button. It uses the WidgetSprites system introduced in modern Minecraft versions.

Constructor:

new CustomButtonWidget(int x, int y, int width, int height, Component label, WidgetSprites sprites, OnPress onPress);

Defining Sprites: You need three textures in your assets: enabled, disabled, and hovered.

WidgetSprites sprites = new WidgetSprites(
ResourceLocation.fromNamespaceAndPath("mymod", "widget/my_btn"), // Enabled
ResourceLocation.fromNamespaceAndPath("mymod", "widget/my_btn_disabled"), // Disabled
ResourceLocation.fromNamespaceAndPath("mymod", "widget/my_btn_hovered") // Hovered/Focused
);

CycleButtonWidget<T>

A button that cycles through a list of values when clicked. This mirrors the vanilla CycleButton but implements IWidget for compatibility.

Example (Cycling Enums):

CycleButtonWidget<Difficulty> difficultyBtn = new CycleButtonWidget<>(
0, 0, 150, 20,
Component.literal("Difficulty"),
Component.literal("Difficulty"),
0,
Difficulty.NORMAL, // Initial
() -> Difficulty.NORMAL, // Default
CycleButton.ValueListSupplier.create(Arrays.asList(Difficulty.values())), // Values
(val) -> Component.literal(val.getKey()) // Label Provider
);

Input Fields (Edit Boxes)

UI Lib significantly enhances text boxes by adding an Input Validation API.

EditBoxWidget

A single-line text input field.

Constructor:

new EditBoxWidget(Font font, int x, int y, int width, int height, Component label);

MultiLineEditBoxWidget

A multi-line text area (like the Book and Quill interface).

Constructor:

new MultiLineEditBoxWidget(Font font, int x, int y, int width, int height, Component placeholder, Component label);

Input Validation API

Both EditBoxWidget and MultiLineEditBoxWidget implement IInputValidatable. This allows you to define rules for what text is allowed. If validation fails, the widget visually indicates an error.

How it works

  1. Override the validateInput(String input) method.
  2. Return a list of error Components.
  3. If the list is not empty, the widget enters Error Mode.

Error Mode Features

  • Visuals: The background texture changes to uilib:widget/text_field_error (a red outline).
  • Tooltip: Hovering over the box displays the error messages in Red.

Example: Validating a Number

EditBoxWidget numberInput = new EditBoxWidget(font, 0, 0, 100, 20, Component.literal("Age")) {
@Override
public List<Component> validateInput(String input) {
List<Component> errors = new ArrayList<>();

try {
int age = Integer.parseInt(input);
if (age < 0) {
// Use built-in helper
errors.add(ValidationErrors.minValue(0));
}
} catch (NumberFormatException e) {
errors.add(ValidationErrors.invalidNumber());
}

return errors;
}
};

Built-in Validation Helpers

The ValidationErrors class provides pre-translated error messages for common scenarios:

  • minLength(int) / maxLength(int)
  • minValue(Number) / maxValue(Number)
  • pattern(String regex)
  • invalidNumber()
  • invalidIdentifier() (ResourceLocation)
  • duplicateKey()