65.9K
CodeProject 正在变化。 阅读更多。
Home

从零开始创建简单的 Java 控制台界面

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (3投票s)

2017年5月19日

CPOL

3分钟阅读

viewsIcon

21722

downloadIcon

272

用于测试 Java 代码的可轻松修改的类似控制台的界面

引言

使用 NetBeans 开发和测试新的 Java 代码可能会让人望而却步,因为输出窗口可能会迅速变得拥挤不堪,并且越来越难以阅读。大多数使用 C# 或 C++ 的开发人员发现,使用 Windows Form 对新代码进行初步测试会非常有帮助,并且通过快速揭示给定类的优缺点来加速开发。但是,使用纯 Java 找到一个简单的表单相当困难。这个项目演示了一种简单、灵活且易于修改的方法,用于在 Java 中创建类似控制台的窗口。

背景

在互联网上搜索“Java 控制台”时,令人惊讶的是,几乎找不到什么信息。我只能找到 一篇 CodeProject 文章 讨论这个问题,而且对于一个应该很简单的问题来说,这篇文章相当复杂。NetBeans 现在似乎是首选的 Java 应用程序开发 IDE。NetBeans 使用 STDINSTDOUTSTDERR 流,但不拥有显示流的控制台实例。这些不包括清除屏幕的支持。我已经使用了这个简单的类似 Java 的控制台窗口,它克服了这些限制,同时允许继续使用 NetBeans 输出窗口。

Using the Code

本文中使用的 Java 控制台窗口演示了数学表达式解析器的测试。但你可以使用任何你选择的应用程序并将其连接到控制台。要构建控制台,请在 NetBeans 中按照以下步骤操作

  1. 新建项目 -> Java -> 应用程序
  2. 保持 Main 未选中
  3. 将新的 Other->Swing JavaForm 添加到项目中
  4. 注意:简单地添加新的 JForm 可能不起作用
  5. 将 Swing TextArea 拖到设计视图上
  6. 注意:不要使用 AWT TextArea - 它将无法工作
  7. 从 'jTextArea1' Properties -> Events -> 添加 'jTextArea1keypressed' 事件
  8. initComponents 下添加 'this.setLocationRelativeTo(null);' 以居中窗口。
  9. 根据需要,在 initComponents 下添加标题文本
  10. jTextArea Properties -> 设置字体、前景色和背景色

控制台窗口的模拟是通过首先添加 jTextArea1KeyPressed 事件来实现的。小心不要将此事件添加到 Console 本身,这将不起作用。大部分繁重的工作都在这个事件中完成

private void jTextArea1KeyPressed(java.awt.event.KeyEvent evt) { 

     if (evt.getKeyCode() == KeyEvent.VK_ENTER) { // Enter was pressed. Your code goes here. 

     String[] lines = jTextArea1.getText().split("\\n"); 
     int nline = lines.length; 
     String sCommand = lines[nline - 1]; 
     sCommand = sCommand.replaceAll("<< ", ""); 
     System.out.println("sCommand =: |" + sCommand + "|"); 

     if (sCommand.equals("quit")) { 
          quitFlag = true; 
          appendString("Are you sure (yes/no)?\n"); 
          // finalizing code goes here return; 
     } 

     if(sCommand.equals("Yes") || sCommand.equals("yes") || sCommand.equals("y")) { 
          if(quitFlag) { 
               System.out.println("User confirmed quit"); 
               Path p = Paths.get("./data/varmap.dat"); 
               varmap.writeMap(p); 
               System.exit(0); 
          } 
     } 

     if(sCommand.equals("No") || sCommand.equals("no") || 
        sCommand.equals("n")) { if(quitFlag) { 
          System.out.println("User cancelled quit"); 
          quitFlag = false; 
          jTextArea1.append("\n\n<< "); 
          return; 
     } 
 
     if (sCommand.equals("cls")) { 
          int nlineCount = jTextArea1.getLineCount(); 
          System.out.println("nlineCount =: " + nlineCount); 
          sCommand = sCommand.replaceAll("<< ", ""); 
          jTextArea1.setText(""); 
          jTextArea1.selectAll(); 
          jTextArea1.append("<< "); 
          return; 
     } 
     ...
     // None of the above so process the command here 
     String sMessage = "Processing '" + sCommand + "'\n"; 
     appendString(sMessage);  
     ... or wire in your own desired test class here

如果你想使用 NetBeans 编译和运行源代码,请下载并解压缩源文件,consolesrc.zip,将其复制到你的 NetBeansProjects 目录,启动 NetBeans,选择 Open Project -> ConsoleDemo,然后选择 Run->Build and Run (重建 dist/jar 文件夹),然后运行该项目。

关注点

我发现控制台窗口对开发和调试各种数学表达式解析器非常有帮助。在这个演示中,我使用了 Java 递归下降解析器 (RDP) 的一个版本 ,取自这里。我添加了一个变量存储和检索映射类 JVarMap,java 和一个预扫描器,JPreScan.java。后者是必需的,因为 RDP 仅评估数值表达式。因此,预扫描会将任何存储的变量转换为它们各自的数值,并将它们替换为要评估的表达式。内置于解析器中的错误处理使查找错误变得更容易,尤其是与 NetBeans IDE Output 结合使用时。

历史

  • 2017年5月18日:版本 1.0.0.0
© . All rights reserved.