代码地址如下:
http://www.demodashi.com/demo/11456.html

一、程序实现

  • 项目目录:

    MyJFrame:实现项目界面样式;

    AppProcess:实现调用api或爬虫拿数据;

    NLIProcess:解析用户输入语句意图;

    lib中是程序开发需要用到的jar包列表。

  • 主要代码说明:

程序不同功能领域由选项卡JTabbedPane展示。用户输入哪个功能领域的问题,将由该领域的选项卡展示答案。

在选项卡中添加选项:

  1. tabbedPanel.addTab("笑话",panel_joke);
  2. tabbedPanel.addTab("新闻",panel_news);
  3. tabbedPanel.addTab("星座",panel_hor);
  4. tabbedPanel.addTab("成语",panel_idiom);
  5. tabbedPanel.addTab("解梦",panel_oneir);

切换选项卡时给出对应功能领域的语料示例:

  1. tabbedPanel.addChangeListener(new ChangeListener(){
  2. @Override
  3. public void stateChanged(ChangeEvent arg0) {
  4. // TODO Auto-generated method stub
  5. int index = tabbedPanel.getSelectedIndex();
  6. areaTxt.setText(introduce + introduces[index]);
  7. ((JScrollPane)tabbedPanel.getComponent(index)).setViewportView(areaTxt);
  8. }
  9. });

输出答案时切换为对应功能选项卡展示答案:

  1. private void jButton_sendActionPerformed(java.awt.event.ActionEvent evt) {
  2. // TODO add your handling code here:
  3. Map<String, Object> retMap = app.process(jTextField1.getText());
  4. jLabel2.setText("");
  5. if (retMap.containsKey("ds")) {
  6. jLabel2.setText(retMap.get("ds").toString());
  7. jLabel2.setForeground(Color.red);
  8. } else if (retMap.containsKey("joke")) {
  9. Object obj = retMap.get("joke");
  10. tabbedPanel.setSelectedIndex(0);
  11. JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(0));
  12. if (obj instanceof String) {
  13. areaTxt.setText(obj.toString());
  14. jpanel.setViewportView(areaTxt);
  15. } else {
  16. JLabel jLabel = new JLabel();
  17. if (obj != null) {
  18. ImageIcon image = new ImageIcon((URL) obj);
  19. jLabel.setIcon(image);
  20. } else {
  21. jLabel.setText("图片加载失败!");
  22. }
  23. jpanel.setViewportView(jLabel);
  24. }
  25. }else if (retMap.containsKey("horoname")){
  26. Object obj = retMap.get("horoname");
  27. tabbedPanel.setSelectedIndex(2);
  28. JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(2));
  29. areaTxt.setText(obj.toString());
  30. jpanel.setViewportView(areaTxt);
  31. }else if(retMap.containsKey("news")){
  32. Object obj = retMap.get("news");
  33. tabbedPanel.setSelectedIndex(1);
  34. JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(1));
  35. if (obj instanceof String) {
  36. areaTxt.setText(obj.toString());
  37. jpanel.setViewportView(areaTxt);
  38. }else{
  39. @SuppressWarnings("unchecked")
  40. Map<String, List<String>> newsMap = (HashMap<String, List<String>>)obj;
  41. List<String> titleList = newsMap.get("title");
  42. final List<String> urlList = newsMap.get("url");
  43. table = getSimpleTable(titleList);
  44. jpanel.setViewportView(table);
  45. table.addMouseListener(new MouseListener(){
  46. @Override
  47. public void mouseClicked(MouseEvent arg0) {
  48. // TODO Auto-generated method stub
  49. // 取得用户所选行的行数
  50. int selectRows=table.getSelectedRows().length;
  51. if(selectRows==1){
  52. // 取得用户所选单行
  53. int selectedRowIndex = table.getSelectedRow();
  54. String url = urlList.get(selectedRowIndex);
  55. Desktop desktop = Desktop.getDesktop();
  56. try {
  57. desktop.browse(new URI(url));
  58. } catch (IOException | URISyntaxException e1) {
  59. e1.printStackTrace();
  60. }
  61. }
  62. }
  63. @Override
  64. public void mouseEntered(MouseEvent arg0) {}
  65. @Override
  66. public void mouseExited(MouseEvent arg0) {}
  67. @Override
  68. public void mousePressed(MouseEvent arg0) {}
  69. @Override
  70. public void mouseReleased(MouseEvent arg0) {}});
  71. }
  72. }else if(retMap.containsKey("oneiromancy")){
  73. Object obj = retMap.get("oneiromancy");
  74. tabbedPanel.setSelectedIndex(4);
  75. final JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(4));
  76. if (obj instanceof String) {
  77. areaTxt.setText(obj.toString());
  78. jpanel.setViewportView(areaTxt);
  79. }else{
  80. @SuppressWarnings("unchecked")
  81. Map<String, List<String>> OneirMap = (HashMap<String, List<String>>)obj;
  82. List<String> wordList = OneirMap.get("word");
  83. final List<String> urlList = OneirMap.get("url");
  84. table = getSimpleTable(wordList);
  85. jpanel.setViewportView(table);
  86. table.addMouseListener(new MouseListener(){
  87. @Override
  88. public void mouseClicked(MouseEvent arg0) {
  89. // TODO Auto-generated method stub
  90. // 取得用户所选行的行数
  91. int selectRows=table.getSelectedRows().length;
  92. if(selectRows==1){
  93. // 取得用户所选单行
  94. int selectedRowIndex = table.getSelectedRow();
  95. String url = urlList.get(selectedRowIndex);
  96. String answer = app.getOneirData(url);
  97. areaTxt.setText(answer);
  98. jpanel.setViewportView(areaTxt);
  99. }
  100. }
  101. @Override
  102. public void mouseEntered(MouseEvent arg0) {}
  103. @Override
  104. public void mouseExited(MouseEvent arg0) {}
  105. @Override
  106. public void mousePressed(MouseEvent arg0) {}
  107. @Override
  108. public void mouseReleased(MouseEvent arg0) {}});
  109. }
  110. }else if(retMap.containsKey("idioms")){
  111. Object obj = retMap.get("idioms");
  112. tabbedPanel.setSelectedIndex(3);
  113. final JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(3));
  114. if (obj instanceof String) {
  115. areaTxt.setText(obj.toString());
  116. jpanel.setViewportView(areaTxt);
  117. }else{
  118. @SuppressWarnings("unchecked")
  119. Map<String, List<String>> OneirMap = (HashMap<String, List<String>>)obj;
  120. List<String> nameList = OneirMap.get("name");
  121. final List<String> idList = OneirMap.get("id");
  122. table = getSimpleTable(nameList);
  123. jpanel.setViewportView(table);
  124. table.addMouseListener(new MouseListener(){
  125. @Override
  126. public void mouseClicked(MouseEvent arg0) {
  127. // TODO Auto-generated method stub
  128. // 取得用户所选行的行数
  129. int selectRows=table.getSelectedRows().length;
  130. if(selectRows==1){
  131. // 取得用户所选单行
  132. int selectedRowIndex = table.getSelectedRow();
  133. String id = idList.get(selectedRowIndex);
  134. String answer = app.getIdiomsP(id);
  135. areaTxt.setText(answer);
  136. jpanel.setViewportView(areaTxt);
  137. }
  138. }
  139. @Override
  140. public void mouseEntered(MouseEvent arg0) {}
  141. @Override
  142. public void mouseExited(MouseEvent arg0) {}
  143. @Override
  144. public void mousePressed(MouseEvent arg0) {}
  145. @Override
  146. public void mouseReleased(MouseEvent arg0) {}});
  147. }
  148. }
  149. }

使用Jsoup解析XML:

  1. private Map<String, List<String>> getNewsMap(String type){
  2. Map<String, List<String>> newsMap = new HashMap<>();
  3. List<String> titleList = new ArrayList<>();
  4. List<String> urlList = new ArrayList<>();
  5. String url = MessageFormat.format("http://www.chinanews.com/rss/{0}.xml", type);
  6. String httpContent = getHttpContent(url,"gbk");
  7. Document doc = Jsoup.parse(httpContent, "", new Parser(new XmlTreeBuilder()));
  8. //item
  9. Elements itemElements = doc.select("item");
  10. if(itemElements != null){
  11. for(Element e : itemElements){
  12. String title = e.select("title").first().text();
  13. String link = e.select("link").first().text();
  14. titleList.add(title);
  15. urlList.add(link);
  16. }
  17. newsMap.put("title", titleList);
  18. newsMap.put("url", urlList);
  19. }
  20. return newsMap;
  21. }

二、运行效果

  • 运行截图如下:

    笑话(支持看笑话、看趣图):



    新闻(显示新闻列表,点选后可进入新闻详情页):



    星座(支持查今日、明日、本周、本月、今年运势):



    成语(支持成语释义、查带某字、词的成语):



    解梦:

三、其他补充

  • 新闻:

    点选新闻标题后会调用浏览器显示新闻详细页(这里本来打算用JEditorPane实现的,实现后发现新闻网页格式变形,查询资料知道JEditorPane 存在缺陷: 不支持CSS样式和JavaScript。所以改为了调用浏览器打开新闻页。)
  • 星座:

    没有找到免费的api接口,星座数据是用爬虫爬下来的,所以第一次问星座问题时出结果会有点慢。

    JAVA小项目实例源码—学习娱乐小助手

代码地址如下:
http://www.demodashi.com/demo/11456.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

JAVA小项目实例源码—学习娱乐小助手的更多相关文章

  1. Java并发包源码学习系列:JDK1.8的ConcurrentHashMap源码解析

    目录 为什么要使用ConcurrentHashMap? ConcurrentHashMap的结构特点 Java8之前 Java8之后 基本常量 重要成员变量 构造方法 tableSizeFor put ...

  2. Java并发包源码学习系列:阻塞队列实现之PriorityBlockingQueue源码解析

    目录 PriorityBlockingQueue概述 类图结构及重要字段 什么是二叉堆 堆的基本操作 向上调整void up(int u) 向下调整void down(int u) 构造器 扩容方法t ...

  3. Java并发包源码学习系列:线程池ScheduledThreadPoolExecutor源码解析

    目录 ScheduledThreadPoolExecutor概述 类图结构 ScheduledExecutorService ScheduledFutureTask FutureTask schedu ...

  4. Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析

    经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...

  5. Java并发包源码学习之AQS框架(三)LockSupport和interrupt

    接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...

  6. Java并发包源码学习之AQS框架(一)概述

    AQS其实就是java.util.concurrent.locks.AbstractQueuedSynchronizer这个类. 阅读Java的并发包源码你会发现这个类是整个java.util.con ...

  7. 【JDK1.8】 Java小白的源码学习系列:HashMap

    目录 Java小白的源码学习系列:HashMap 官方文档解读 基本数据结构 基本源码解读 基本成员变量 构造器 巧妙的tableSizeFor put方法 巧妙的hash方法 JDK1.8的putV ...

  8. Java并发包源码学习系列:CLH同步队列及同步资源获取与释放

    目录 本篇学习目标 CLH队列的结构 资源获取 入队Node addWaiter(Node mode) 不断尝试Node enq(final Node node) boolean acquireQue ...

  9. Java并发包源码学习系列:AQS共享式与独占式获取与释放资源的区别

    目录 Java并发包源码学习系列:AQS共享模式获取与释放资源 独占式获取资源 void acquire(int arg) boolean acquireQueued(Node, int) 独占式释放 ...

随机推荐

  1. [BZOJ2458][BeiJing2011]最小三角形(分治)

    求平面上n个点组成的周长最小的三角形. 回忆平面最近点对的做法,找到横坐标的中点mid分治到两边,合并时考虑离mid横坐标不超过当前最小值d的所有点,按y排序后暴力更新答案. 这个题也一样,先分治到两 ...

  2. 【20181019T2】硬币【矩阵快速幂优化DP】

    题面 [错解] 哎\(N \leq 50\)?双向搜索? 切了切-- 等下,好像要求方案数-- 好像搜不了 哎他给\(V_{i} | V_{i+1}\)干嘛? 肯定有用啊 为了体现条件的用处,我在搜下 ...

  3. [Lydsy1805月赛] quailty 算法

    稍微建一下模型就可以发现,题目要求的其实是一个最小异或基环森林.... 可以用类似最小生成树的拟阵性质来证明,贪心的从小的边权开始依次尝试加入的方法是对的. 所以我们把a[]排完序之后直接递归贪心就行 ...

  4. 20172333 2017-2018-2 《Java程序设计》第4周学习总结

    20172333 2017-2018-2 <Java程序设计>第4周学习总结 教材学习内容 1.类结构的定义与概念 2.利用实例数据建立对象状态的概念 3.描述可见性修饰符作用在方法和数据 ...

  5. 93.数字三角形W(深搜)

    2189 数字三角形W  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 数字三角形 要求走到最后mod 10 ...

  6. Xcode9出现错误safe area layout guide before ios 9 真正解决办法

    网上很多解决办法瞎扯淡,以讹传讹之势愈演愈烈. 正解是选中控制器,右边面板的Builds for 选择iOS9.0 and Later,如下图红框广为流传的错解是不勾选Use Safe Area La ...

  7. dns问题,QQ打得开,网页打不开

    dns问题,QQ打得开,网页打不开 ip4 dns 改为114.114.114.114. 原因有可能是路由出错之类的.114是默认的通用ip

  8. C# 获取文件版本

    var versionInfo = FileVersionInfo.GetVersionInfo(filePath); String productVersion = versionInfo.Prod ...

  9. [Bug]The test form is only available for requests from the local machine.

    引言 当您尝试从远程计算机访问 Web 服务时,不会显示“调用”按钮.并且,您会收到以下错误信息: The test form is only available for requests from ...

  10. 【js UUID】JS生成UUID 使用

    * 生成UUID * @returns */ function UUID() { var s = []; var hexDigits = "0123456789abcdef"; f ...