教程 1
这是学习更多关于如何使用 lanterna 的第一个教程和入口点。我们将在本教程中使用下层来演示如何在光标周围移动以及如何输出不同样式和颜色的文本。
首先,我们需要获取一个 Terminal 对象。这将是我们与终端本身交互的主要方式。有几个可用的实现,选择正确的很重要:
UnixTerminal
- 通过标准输入/输出使用 ANSI 转义码来执行操作SwingTerminal
- 创建一个实现终端仿真器的 Swing JComponent 扩展表面SwingTerminalFrame
- 创建一个 Swing JFrame,其中包含一个正在实现终端仿真器的表面AWTTerminal
- 创建实现终端仿真器的 AWT 组件扩展表面AWTTerminalFrame
- 创建一个 AWT 框架,其中包含实现终端仿真器的表面TelnetTerminal
- 通过 TelnetTerminalServer,这允许您通过终端接口控制到客户端的输出VirtualTerminal
- 完整的内存实现
如果您打算编写一个在标准控制台中运行的程序,例如在您通过某些终端仿真器和 ssh 连接到的远程服务器上,您需要的是 UnixTerminal。但是,在 IDE 中开发程序时,您可能会遇到问题,因为 IDE 的控制台可能没有正确实现 ANSI 转义码并且输出完全是垃圾。因此,您可能希望使用其中一个图形终端仿真器(Swing 或 AWT),它会在您运行程序时打开一个新窗口,而不是写入标准输出,然后在应用程序准备就绪时切换到 UnixTerminal。为了简化这一点,lanterna 提供了一个带有 DefaultTerminalFactory 实现的 TerminalFactory,它试图找出要使用的实现。它'
DefaultTerminalFactory defaultTerminalFactory = new DefaultTerminalFactory();
DefaultTerminalFactory 可以进一步调整,但我们将在本教程中将其保留为默认设置。
Terminal terminal = null;
try {
让工厂发挥它的魔力,并通过调用 createTerminal() 找出要使用的实现
terminal = defaultTerminalFactory.createTerminal();
如果我们有一个终端仿真器(可能是 Swing),那么此时我们正在查看一个空的终端仿真器窗口。如果代码通过手动调用 java 在另一个终端仿真器(putty、gnome-terminal、konsole 等)中运行,则内容还没有更改。
让我们打印一些文本,这与调用 System.out.println("Hello"); 相同。
terminal.putCharacter('H');
terminal.putCharacter('e');
terminal.putCharacter('l');
terminal.putCharacter('l');
terminal.putCharacter('o');
terminal.putCharacter('\n');
terminal.flush();
注意上面的 flush() 调用;在本机终端和捆绑终端仿真器的情况下,都必须通过调用 flush() 来完成终端输出操作。Lanterna 的 Unix 终端本身不会缓冲输出,但可以假设底层 I/O 层会缓冲。对于捆绑在 lanterna 中的终端仿真器,flush 调用将向底层 UI 组件发出重绘信号。
Thread.sleep(2000);
此时光标应该在下一行的开头,紧跟在刚刚打印的 Hello 之后。让我们将光标移动到相对于当前位置的新位置。请注意,我们仍然需要调用 flush() 以确保更改立即可见(即用户可以看到文本光标移动到新位置)。这里要注意的一件事是,如果您在“正确”终端中运行它并且光标位置在底线,它实际上不会向上移动文本。尝试将光标位置设置在终端边界之外通常会四舍五入到第一/最后一列/行。如果遇到这种情况,请在运行此代码之前清除终端内容,使光标再次位于顶部。
TerminalPosition startPosition = terminal.getCursorPosition();
terminal.setCursorPosition(startPosition.withRelativeColumn(3).withRelativeRow(2));
terminal.flush();
Thread.sleep(2000);
让我们继续更改打印文本的颜色。这不会改变任何当前存在的文本,它只会对我们在此之后打印的任何内容生效。
terminal.setBackgroundColor(TextColor.ANSI.BLUE);
terminal.setForegroundColor(TextColor.ANSI.YELLOW);
现在用这些新颜色打印文本
terminal.putCharacter('Y');
terminal.putCharacter('e');
terminal.putCharacter('l');
terminal.putCharacter('l');
terminal.putCharacter('o');
terminal.putCharacter('w');
terminal.putCharacter(' ');
terminal.putCharacter('o');
terminal.putCharacter('n');
terminal.putCharacter(' ');
terminal.putCharacter('b');
terminal.putCharacter('l');
terminal.putCharacter('u');
terminal.putCharacter('e');
terminal.flush();
Thread.sleep(2000);
除了颜色之外,大多数终端都支持某种可以选择性启用的样式。最常见的一种是粗体模式,在许多终端实现(模拟器和其他)上,它实际上根本不使用粗体文本,而是改变了前景色的色调,因此它有点突出。让我们以粗体模式打印与上面相同的文本进行比较。
请注意,startPosition 的值与我们使用 getTerminalSize() 检索它时的值相同,TerminalPosition 类是不可变的,调用 with* 方法将返回一个副本。所以下面的 setCursorPosition(..) 调用将把我们放在前一行的下一行。
terminal.setCursorPosition(startPosition.withRelativeColumn(3).withRelativeRow(3));
terminal.flush();
Thread.sleep(2000);
terminal.enableSGR(SGR.BOLD);
terminal.putCharacter('Y');
terminal.putCharacter('e');
terminal.putCharacter('l');
terminal.putCharacter('l');
terminal.putCharacter('o');
terminal.putCharacter('w');
terminal.putCharacter(' ');
terminal.putCharacter('o');
terminal.putCharacter('n');
terminal.putCharacter(' ');
terminal.putCharacter('b');
terminal.putCharacter('l');
terminal.putCharacter('u');
terminal.putCharacter('e');
terminal.flush();
Thread.sleep(2000);
好的,现在就足够了。让我们重置颜色和 SGR 修改器并再向下移动一行
terminal.resetColorAndSGR();
terminal.setCursorPosition(terminal.getCursorPosition().withColumn(0).withRelativeRow(1));
terminal.putCharacter('D');
terminal.putCharacter('o');
terminal.putCharacter('n');
terminal.putCharacter('e');
terminal.putCharacter('\n');
terminal.flush();
Thread.sleep(2000);
哔声并退出
terminal.bell();
terminal.flush();
Thread.sleep(200);
}
catch(IOException e) {
e.printStackTrace();
}
finally {
if(terminal != null) {
try {
关闭终端并不总是有效,但如果您运行 Swing 或 AWT 捆绑的终端仿真器,例如,它将关闭窗口并允许该应用程序终止。在 UnixTerminal 上调用它不会有任何影响。
terminal.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
}
本教程的完整代码可在源代码的测试部分中找到