GUI 控件基类

基本信息

属性 值
屏幕基类 com.github.lunatrius.core.client.gui.GuiScreenBase
数字输入控件 com.github.lunatrius.core.client.gui.GuiNumericField
文本绘制工具 com.github.lunatrius.core.client.gui.FontRendererHelper

三个类互相独立:GuiScreenBase 的输入分发会 instanceof GuiNumericField 地调用它,FontRendererHelper 则是纯静态方法集合。

GuiScreenBase extends GuiScreen

字段

字段 类型 初值
parentScreen protected final GuiScreen 由构造函数传入
buttonList protected List<GuiButton> super.buttonList(源码注释原文:// I feel dirty)
textFields protected List<GuiTextField> new ArrayList<GuiTextField>()

构造函数

签名 行为
public GuiScreenBase() this(null)
public GuiScreenBase(final GuiScreen parentScreen) 赋值 this.parentScreen = parentScreen

覆写方法

签名 行为
public void initGui() buttonList.clear() + textFields.clear()
protected void mouseClicked(int mouseX, int mouseY, int mouseEvent) 依次对 buttonList 中的 GuiNumericField 调 mouseClicked、对 textFields 调 mouseClicked,最后 super.mouseClicked
protected void keyTyped(char character, int code) code == Keyboard.KEY_ESCAPE 时 mc.displayGuiScreen(this.parentScreen) 并 return;否则分发键入并在数字框获得焦点时回调 actionPerformed(numericField),最后 super.keyTyped
public void updateScreen() 对数字框调 updateCursorCounter、对文本框调 updateCursorCounter
public void drawScreen(int mouseX, int mouseY, float partialTicks) super.drawScreen 后对每个 textFields 调 drawTextBox()

[!NOTE] drawScreen 只为 textFields 绘制,不绘制 buttonList——因为 GuiNumericField 自身已在 drawButton 内部绘制了它的文本框。

GuiNumericField extends GuiButton

私有常量

常量 值
DEFAULT_VALUE 0
BUTTON_WIDTH 12

内部成员

字段 类型 说明
guiTextField private final GuiTextField 宽度 width - BUTTON_WIDTH * 2 - 2,位置 (x + 1, y + 1)
guiButtonDec private final GuiButton 文本 "-",id = 0,位置 x + width - BUTTON_WIDTH * 2
guiButtonInc private final GuiButton 文本 "+",id = 1,位置 x + width - BUTTON_WIDTH * 1
previous private String String.valueOf(DEFAULT_VALUE)
minimum private int Integer.MIN_VALUE
maximum private int Integer.MAX_VALUE
wasFocused private boolean false

[!WARNING] 两个内部按钮的 id 被硬编码为 0 和 1,与外层 GuiButton 的 id 无关。若同一个 GuiScreen 里放了两个 GuiNumericField,它们的 +/- 按钮 id 会重复,Forge 的 actionPerformed 按 id 分发时可能命中错误对象。

构造函数

签名 宽 / 高
public GuiNumericField(FontRenderer fontRenderer, int id, int x, int y) 100 × 20
public GuiNumericField(FontRenderer fontRenderer, int id, int x, int y, int width) 宽由参数决定,高 20
public GuiNumericField(FontRenderer fontRenderer, int id, int x, int y, int width, int height) 最完整形式,内部调 super(id, 0, 0, 0, 0, "") 并 setValue(DEFAULT_VALUE)

覆写方法

签名 行为
public boolean mousePressed(Minecraft minecraft, int x, int y) 若上帧有焦点而本帧无焦点,返回 true 吃掉这次点击(防止焦点跳走时误触 -/+);否则更新 wasFocused 并返回 -/+ 按钮的 mousePressed 逻辑或
public void drawButton(Minecraft minecraft, int x, int y) 仅当 this.visible 时依次绘制 guiTextField、guiButtonInc、guiButtonDec

公共方法

签名 行为
public void mouseClicked(int x, int y, int action) 转发给 guiTextField.mouseClicked;+ 被按则 setValue(getValue() + 1),- 被按则 setValue(getValue() - 1)
public boolean keyTyped(char character, int code) 仅在文本框有焦点时处理;文本为空或等于 "-" 时直接 return true;否则 Long.parseLong 后按 minimum/maximum 钳制并回写,NumberFormatException 时恢复为 previous 并 return false
public void updateCursorCounter() 转发 guiTextField.updateCursorCounter()
public boolean isFocused() 转发 guiTextField.isFocused()
public void setEnabled(boolean enabled) 同时设置自身与 guiTextField、guiButtonInc、guiButtonDec 的 enabled
public void setMinimum(int minimum) / public int getMinimum() 读写 minimum
public void setMaximum(int maximum) / public int getMaximum() 读写 maximum
public void setValue(int value) 先按 minimum/maximum 钳制再 guiTextField.setText(String.valueOf(value))
public int getValue() 文本为空或为 "-" 时返回 DEFAULT_VALUE,否则 Integer.parseInt(text)

[!NOTE] keyTyped 用 Long.parseLong 解析,但 getValue/setValue 用 int——超出 int 范围的输入会先被 Long 解析成功、再在写回 setText 时按钳制后的值处理。

FontRendererHelper

三个静态方法,全部使用 drawStringWithShadow(带阴影绘制):

签名 计算方式
public static void drawLeftAlignedString(FontRenderer fontRenderer, String str, int x, int y, int color) 直接 drawStringWithShadow(str, x, y, color)
public static void drawCenteredString(FontRenderer fontRenderer, String str, int x, int y, int color) x - fontRenderer.getStringWidth(str) / 2(整数除法,奇数宽度会偏左 1 像素)
public static void drawRightAlignedString(FontRenderer fontRenderer, String str, int x, int y, int color) x - fontRenderer.getStringWidth(str)

相关条目