如何在Java的UserInterface类中调用基于Lanterna库的Text类?
解决方案:在退出时触发Lanterna终端界面
嘿,我明白你的需求了——当用户输入"x"停止程序时,调用Lanterna的Text类显示感谢界面。现在你的Text类只有main方法,没法直接从UserInterface调用,咱们来一步步调整代码:
1. 重构Text类,封装显示逻辑
把Text里的终端界面逻辑提取成一个可调用的静态方法,这样其他类就能直接调用它了:
import com.googlecode.lanterna.terminal.*; import com.googlecode.lanterna.terminal.ansi.*; import java.io.IOException; public class Text { // 把终端显示逻辑封装成静态方法,供外部调用 public static void showExitScreen() throws IOException { Terminal terminal = new DefaultTerminalFactory().createTerminal(); terminal.enterPrivateMode(); terminal.newTextGraphics().putString(20, 9, "Thank you for using Quote Generator!"); terminal.flush(); terminal.readInput(); // 等待用户输入后退出界面 terminal.exitPrivateMode(); } // 保留main方法,方便单独测试这个终端界面 public static void main (String[] args) throws IOException { showExitScreen(); } }
2. 在UserInterface中调用这个方法
在command.equals("x")的分支里,直接调用刚才写的showExitScreen()方法就行。因为start方法已经声明了throws IOException,所以不用额外处理异常:
import java.util.Scanner; import java.io.IOException; public class UserInterface { private QuoteList ql; private Scanner scanner; public UserInterface(QuoteList ql, Scanner scanner) { this.ql = ql; this.scanner = scanner; } public void start() throws IOException { while (true) { System.out.print("Commands:\n" + "1 - import quotes\n" + "2 - add a quote\n" + "3 - share a quote\n" + "4 - tell all quotes\n" + "x - stop\n"); String command = scanner.nextLine(); if (command.equals("1")) { System.out.print("Enter file: "); String file = scanner.nextLine(); this.ql.importFile(file); } else if (command.equals("2")) { System.out.print("Write your quote: "); String q = scanner.nextLine(); this.ql.addQuote(q); } else if (command.equals("3")) { System.out.println(ql.shareQuote()); } else if (command.equals("4")) { this.ql.printQuotes(); } else if (command.equals("x")) { // 调用Text类的退出感谢界面 Text.showExitScreen(); break; } } } }
3. 编译和运行的正确姿势
因为用到了Lanterna的jar包,编译时要确保类路径包含它:
- 编译Text.java:
javac -cp lanterna.jar Text.java - 编译UserInterface.java(假设QuoteList已经编译完成):
- Linux/macOS:
javac -cp .:lanterna.jar UserInterface.java - Windows:
javac -cp .;lanterna.jar UserInterface.java
- Linux/macOS:
- 运行主程序(假设你的入口类是包含main方法的启动类):
- Linux/macOS:
java -cp .:lanterna.jar YourMainEntryClass - Windows:
java -cp .;lanterna.jar YourMainEntryClass
- Linux/macOS:
这样当用户输入"x"时,程序会先弹出Lanterna的终端界面显示感谢信息,等用户按下任意键后退出这个界面,然后结束主循环,程序正常退出。
内容的提问来源于stack exchange,提问作者sqpl13




