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