本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。
Keypad
Keypad 是一个带数字键盘的窗口(Window),它锚定在获得焦点的文本字段的上方或下方。当处于计算器模式(isCalculator)时,它会增加第 4 列 + − × ÷ =,解算输入的算式,并将结果写回字段。
其用法几乎总是间接的:你在 TextField 上配置 Keyboard.KEYPAD/CALCULATOR(或 EditMode.CURRENCY),字段本身会在获得焦点时实例化并显示 Keypad。手动实例化它的情况很少见。
🔴 · 包:
dev.crossfly.ui· 继承:Window· 样式:KeypadStyle
何时使用
- 内嵌的数字输入(不依赖原生键盘),包括在桌面端。
- 计算器模式:允许用户在货币/数字字段内进行计算。
何时不要使用
- 自由文本输入 → 使用原生键盘(
Keyboard.DEFAULT)。 - 你很少直接实例化
Keypad—— 请在TextField上配置键盘。
外观
按钮网格(GridLayout):3 列(0–9、退格、回车)或计算器模式下 4 列(带运算符)。按钮使用 keyWidth/keyHeight(× 字体高度)和四角圆角。窗口在能容纳时定位于字段下方,否则位于上方(会考虑浮动的 caption)。
``
完整示例(复制、粘贴并运行)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
/** 可执行的主界面。将 launcher 指向此类(classname)并运行:gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
// 接收 Keypad 按键的数字字段
TextField valor = new TextField().caption("Quantidade");
add(LAY_AUTO, valor);
// 输出 Label
Label saida = new Label("Digite no keypad e toque em Confirmar");
add(LAY_AUTO, saida);
// 打开锚定到该字段的 Keypad 的按钮(直接使用)
Button abrir = new Button("Abrir keypad").onAction(c -> {
Keypad kp = new Keypad(valor); // target 是上面的 TextField
kp.show();
});
add(LAY_AUTO, abrir);
// Keypad 写入该字段;提交时读取 getText()
Button confirmar = new Button("Confirmar")
.onAction(c -> saida.setText("Valor: " + valor.getText()));
add(LAY_AUTO, confirmar);
}
}
下面的片段只展示核心部分(放入
onShow()内的内容)。要运行它们,请将其放入上面的MainWindow骨架中。
基本用法(间接,通过 TextField)
// TextField 在聚焦时自动显示 Keypad:
TextField valor = new TextField().caption("Quantidade");
valor.setKeyboard(Keyboard.KEYPAD); // 内置数字键盘
container.add(LAY_AUTO, valor);
// 计算器模式 — CURRENCY 默认已使用 CALCULATOR:
TextField preco = new TextField().caption("Preço");
preco.setMode(EditMode.CURRENCY, true);
container.add(LAY_AUTO, preco);
直接使用(高级)
// 手动将 Keypad 锚定到某个字段:
Keypad kp = new Keypad(campo); // 字段是一个 TextInput (TextField/TextArea)
kp.show();
// 在计算器模式下:
Keypad calc = new Keypad(campo);
calc.<KeypadStyle>getStyle().isCalculator(true);
calc.show();
构造函数
| 构造函数 | 描述 |
|---|---|
Keypad(TextInput target) |
创建锚定到字段 target 的键盘,target 将接收按键 |
属性与自定义(通过 KeypadStyle)
| 属性 | 类型 | 作用 |
|---|---|---|
.isCalculator(boolean) |
boolean |
带 + − × ÷ 和 = 按钮的第 4 列 |
.is1to9(boolean) |
boolean |
按键顺序(顶部为 1-2-3 还是 7-8-9) |
.keyWidth / .keyHeight |
float |
按键尺寸(× 字体高度) |
.digitColor / .specialColor |
ARGB | 数字 / 特殊键的颜色 |
.keypadBackColor |
ARGB | 按键背景 |
.enterIcon / .backspaceIcon |
Icon |
回车和退格的图标 |
.radiusTL/TR/BL/BR |
float |
圆角半径 |
回调与事件
Keypad 不暴露自己的 onAction。它将按键发送给 target:
- 数字 →
target.onKeyTyped(c)。 - 退格 / 回车 →
target.onKeyDown(Input.Keys.BACKSPACE / ENTER)。 - 在计算器模式下,
=会计算并通过target.setText(...)写入结果。 - 关闭时(
onRemove),焦点通过restoreFocusAtEnd()返回字段。
要作出响应,请观察字段(getText()),而不是 Keypad。
状态
- Enter ↔ Equals: 在计算器模式下,底部按钮会根据是否有待处理的运算,在
Enter(图标)和=(文本)之间切换。 - 点击外部或确认(
Enter)时窗口关闭。
带内嵌计算器的货币字段
TextField total = new TextField().caption("Total");
total.setMode(EditMode.CURRENCY, true); // 以计算器模式打开 Keypad
container.add(LAY_AUTO, total);
// 用户输入 "10 + 5 =",字段随后显示 15,00。
在桌面端强制使用 Keypad
// NUMERIC 在桌面端调用 showInput() 时会自动降级为 KEYPAD;
// 要在任意平台上确保使用 Keypad,请显式使用 KEYPAD:
TextField codigo = new TextField().caption("Código");
codigo.setKeyboard(Keyboard.KEYPAD);
container.add(LAY_AUTO, codigo);
最佳实践
- 优先在
TextField上配置键盘(setKeyboard/setMode),而不是直接实例化Keypad。 - 对于货币输入,
EditMode.CURRENCY已自带计算器 —— 无需额外配置任何东西。
常见错误
- 在
Keypad上注册onAction: 它不会触发自己的动作;请观察目标字段。 - 在没有可聚焦
target的情况下实例化Keypad: 它需要一个TextInput来发送按键。
另请参阅
这个页面有帮助吗?感谢你的反馈!