组件渲染
您可以通过以下两种方式实现组件渲染:完全编程式或使用ANTLR Stringtemplate。严格来说,有一个简单的Function渲染接口,它接受Context作为输入并输出一个AttributedString的列表。这允许您在模板和代码之间进行选择。
模板在不需要进行复杂操作或只是希望稍微修改现有组件布局时是一个不错的选择。通过代码渲染则可以给你更大的灵活性,让你完成任何需要的操作。
The programmatic way to render is to create a Function:
class StringInputCustomRenderer implements Function<StringInputContext, List<AttributedString>> {
@Override
public List<AttributedString> apply(StringInputContext context) {
AttributedStringBuilder builder = new AttributedStringBuilder();
builder.append(context.getName());
builder.append(" ");
if (context.getResultValue() != null) {
builder.append(context.getResultValue());
}
else {
String input = context.getInput();
if (StringUtils.hasText(input)) {
builder.append(input);
}
else {
builder.append("[Default " + context.getDefaultValue() + "]");
}
}
return Arrays.asList(builder.toAttributedString());
}
}
然后你可以将其连接到一个组件:
@Command(name = "component stringcustom", description = "String input", group = "Components")
public String stringInputCustom(boolean mask) {
StringInput component = new StringInput(getTerminal(), "Enter value", "myvalue",
new StringInputCustomRenderer());
ResourceLoader resourceLoader = null; // getResourceLoader();
TemplateExecutor templateExecutor = null; // getTemplateExecutor();
component.setResourceLoader(resourceLoader);
component.setTemplateExecutor(templateExecutor);
if (mask) {
component.setMaskCharacter('*');
}
StringInputContext context = component.run(StringInputContext.empty());
return "Got value " + context.getResultValue();
}
组件有自己的上下文,但通常会从父组件类型共享一些功能。以下表格展示了这些上下文变量:
| 键 | 描述 |
|---|---|
|
组件渲染其结果后的值。 |
|
该组件的名称——即其标题。 |
|
The possible message set for a component. |
|
The level of a message — one of |
|
如果 level 为 |
|
如果 level 为 |
|
如果 level 为 |
|
The raw user input. |
| 键 | 描述 |
|---|---|
|
该组件的名称——即其标题。 |
|
原始用户输入——主要用于过滤。 |
|
完整的项状态列表。 |
|
可见的项目状态列表。 |
|
返回 |
|
当前选择器中的行号。 |
| 键 | 描述 |
|---|---|
|
终端宽度,类型为 |