JAVA小项目实例源码—学习娱乐小助手
一、程序实现
- 项目目录:
MyJFrame:实现项目界面样式;
AppProcess:实现调用api或爬虫拿数据;
NLIProcess:解析用户输入语句意图;
lib中是程序开发需要用到的jar包列表。

- 主要代码说明:
程序不同功能领域由选项卡JTabbedPane展示。用户输入哪个功能领域的问题,将由该领域的选项卡展示答案。
在选项卡中添加选项:
tabbedPanel.addTab("笑话",panel_joke);
tabbedPanel.addTab("新闻",panel_news);
tabbedPanel.addTab("星座",panel_hor);
tabbedPanel.addTab("成语",panel_idiom);
tabbedPanel.addTab("解梦",panel_oneir);
切换选项卡时给出对应功能领域的语料示例:
tabbedPanel.addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent arg0) {
// TODO Auto-generated method stub
int index = tabbedPanel.getSelectedIndex();
areaTxt.setText(introduce + introduces[index]);
((JScrollPane)tabbedPanel.getComponent(index)).setViewportView(areaTxt);
}
});
输出答案时切换为对应功能选项卡展示答案:
private void jButton_sendActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
Map<String, Object> retMap = app.process(jTextField1.getText());
jLabel2.setText("");
if (retMap.containsKey("ds")) {
jLabel2.setText(retMap.get("ds").toString());
jLabel2.setForeground(Color.red);
} else if (retMap.containsKey("joke")) {
Object obj = retMap.get("joke");
tabbedPanel.setSelectedIndex(0);
JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(0));
if (obj instanceof String) {
areaTxt.setText(obj.toString());
jpanel.setViewportView(areaTxt);
} else {
JLabel jLabel = new JLabel();
if (obj != null) {
ImageIcon image = new ImageIcon((URL) obj);
jLabel.setIcon(image);
} else {
jLabel.setText("图片加载失败!");
}
jpanel.setViewportView(jLabel);
}
}else if (retMap.containsKey("horoname")){
Object obj = retMap.get("horoname");
tabbedPanel.setSelectedIndex(2);
JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(2));
areaTxt.setText(obj.toString());
jpanel.setViewportView(areaTxt);
}else if(retMap.containsKey("news")){
Object obj = retMap.get("news");
tabbedPanel.setSelectedIndex(1);
JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(1));
if (obj instanceof String) {
areaTxt.setText(obj.toString());
jpanel.setViewportView(areaTxt);
}else{
@SuppressWarnings("unchecked")
Map<String, List<String>> newsMap = (HashMap<String, List<String>>)obj;
List<String> titleList = newsMap.get("title");
final List<String> urlList = newsMap.get("url");
table = getSimpleTable(titleList);
jpanel.setViewportView(table);
table.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
// 取得用户所选行的行数
int selectRows=table.getSelectedRows().length;
if(selectRows==1){
// 取得用户所选单行
int selectedRowIndex = table.getSelectedRow();
String url = urlList.get(selectedRowIndex);
Desktop desktop = Desktop.getDesktop();
try {
desktop.browse(new URI(url));
} catch (IOException | URISyntaxException e1) {
e1.printStackTrace();
}
}
}
@Override
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}
@Override
public void mousePressed(MouseEvent arg0) {}
@Override
public void mouseReleased(MouseEvent arg0) {}});
}
}else if(retMap.containsKey("oneiromancy")){
Object obj = retMap.get("oneiromancy");
tabbedPanel.setSelectedIndex(4);
final JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(4));
if (obj instanceof String) {
areaTxt.setText(obj.toString());
jpanel.setViewportView(areaTxt);
}else{
@SuppressWarnings("unchecked")
Map<String, List<String>> OneirMap = (HashMap<String, List<String>>)obj;
List<String> wordList = OneirMap.get("word");
final List<String> urlList = OneirMap.get("url");
table = getSimpleTable(wordList);
jpanel.setViewportView(table);
table.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
// 取得用户所选行的行数
int selectRows=table.getSelectedRows().length;
if(selectRows==1){
// 取得用户所选单行
int selectedRowIndex = table.getSelectedRow();
String url = urlList.get(selectedRowIndex);
String answer = app.getOneirData(url);
areaTxt.setText(answer);
jpanel.setViewportView(areaTxt);
}
}
@Override
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}
@Override
public void mousePressed(MouseEvent arg0) {}
@Override
public void mouseReleased(MouseEvent arg0) {}});
}
}else if(retMap.containsKey("idioms")){
Object obj = retMap.get("idioms");
tabbedPanel.setSelectedIndex(3);
final JScrollPane jpanel = ((JScrollPane) tabbedPanel.getComponent(3));
if (obj instanceof String) {
areaTxt.setText(obj.toString());
jpanel.setViewportView(areaTxt);
}else{
@SuppressWarnings("unchecked")
Map<String, List<String>> OneirMap = (HashMap<String, List<String>>)obj;
List<String> nameList = OneirMap.get("name");
final List<String> idList = OneirMap.get("id");
table = getSimpleTable(nameList);
jpanel.setViewportView(table);
table.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
// 取得用户所选行的行数
int selectRows=table.getSelectedRows().length;
if(selectRows==1){
// 取得用户所选单行
int selectedRowIndex = table.getSelectedRow();
String id = idList.get(selectedRowIndex);
String answer = app.getIdiomsP(id);
areaTxt.setText(answer);
jpanel.setViewportView(areaTxt);
}
}
@Override
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}
@Override
public void mousePressed(MouseEvent arg0) {}
@Override
public void mouseReleased(MouseEvent arg0) {}});
}
}
}
使用Jsoup解析XML:
private Map<String, List<String>> getNewsMap(String type){
Map<String, List<String>> newsMap = new HashMap<>();
List<String> titleList = new ArrayList<>();
List<String> urlList = new ArrayList<>();
String url = MessageFormat.format("http://www.chinanews.com/rss/{0}.xml", type);
String httpContent = getHttpContent(url,"gbk");
Document doc = Jsoup.parse(httpContent, "", new Parser(new XmlTreeBuilder()));
//item
Elements itemElements = doc.select("item");
if(itemElements != null){
for(Element e : itemElements){
String title = e.select("title").first().text();
String link = e.select("link").first().text();
titleList.add(title);
urlList.add(link);
}
newsMap.put("title", titleList);
newsMap.put("url", urlList);
}
return newsMap;
}
二、运行效果
- 运行截图如下:
笑话(支持看笑话、看趣图):

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

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

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

解梦:

三、其他补充
- 新闻:
点选新闻标题后会调用浏览器显示新闻详细页(这里本来打算用JEditorPane实现的,实现后发现新闻网页格式变形,查询资料知道JEditorPane 存在缺陷: 不支持CSS样式和JavaScript。所以改为了调用浏览器打开新闻页。) - 星座:
没有找到免费的api接口,星座数据是用爬虫爬下来的,所以第一次问星座问题时出结果会有点慢。
JAVA小项目实例源码—学习娱乐小助手
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
JAVA小项目实例源码—学习娱乐小助手的更多相关文章
- Java并发包源码学习系列:JDK1.8的ConcurrentHashMap源码解析
目录 为什么要使用ConcurrentHashMap? ConcurrentHashMap的结构特点 Java8之前 Java8之后 基本常量 重要成员变量 构造方法 tableSizeFor put ...
- Java并发包源码学习系列:阻塞队列实现之PriorityBlockingQueue源码解析
目录 PriorityBlockingQueue概述 类图结构及重要字段 什么是二叉堆 堆的基本操作 向上调整void up(int u) 向下调整void down(int u) 构造器 扩容方法t ...
- Java并发包源码学习系列:线程池ScheduledThreadPoolExecutor源码解析
目录 ScheduledThreadPoolExecutor概述 类图结构 ScheduledExecutorService ScheduledFutureTask FutureTask schedu ...
- Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析
经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...
- Java并发包源码学习之AQS框架(三)LockSupport和interrupt
接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...
- Java并发包源码学习之AQS框架(一)概述
AQS其实就是java.util.concurrent.locks.AbstractQueuedSynchronizer这个类. 阅读Java的并发包源码你会发现这个类是整个java.util.con ...
- 【JDK1.8】 Java小白的源码学习系列:HashMap
目录 Java小白的源码学习系列:HashMap 官方文档解读 基本数据结构 基本源码解读 基本成员变量 构造器 巧妙的tableSizeFor put方法 巧妙的hash方法 JDK1.8的putV ...
- Java并发包源码学习系列:CLH同步队列及同步资源获取与释放
目录 本篇学习目标 CLH队列的结构 资源获取 入队Node addWaiter(Node mode) 不断尝试Node enq(final Node node) boolean acquireQue ...
- Java并发包源码学习系列:AQS共享式与独占式获取与释放资源的区别
目录 Java并发包源码学习系列:AQS共享模式获取与释放资源 独占式获取资源 void acquire(int arg) boolean acquireQueued(Node, int) 独占式释放 ...
随机推荐
- 【枚举】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem D. Cutting Potatoes
题意:有n个土豆,每个有体积V(i),你可以将每个土豆等分为不超过K份,问你最大块和最小块比值最小为多少. 直接枚举切法,只有n*K种,然后保证其为最大块,去算其他块的切法,即让其他块切得尽可能大即可 ...
- 【最短路】【Heap-dijkstra】hihocoder 1587 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 J. Typist's Problem
题意:给你一个串,仅含有a~g,且每个字母只出现最多一次.和一个光标初始位置,以及一个目标串,问你最少要多少的代价变化成目标串. 有五种操作:在光标前添加一个未出现过的字母,代价1. 删除光标前或者光 ...
- Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) E. Robot Arm 线段树
E. Robot Arm 题目连接: http://www.codeforces.com/contest/618/problem/E Description Roger is a robot. He ...
- redis(一)Windows下安装redis服务、搭建redis主从复制
接下来会写一个redis实战系列,在此记录,有什么问题大家请随时批评. 好了,进入正题,这篇会将redis以windows服务形式提供服务(搭建一个简单的主从复制 M:6379:s:6380.6381 ...
- DN安卓2014版(5-9)
DN安卓2014版(5-9) 联系2g32@sina.com
- nio教程二
要使用Selector,得向Selector注册Channel,然后调用它的select()方法.这个方法会一直阻塞到某个注册的通道有事件就绪.一旦这个方法返回,线程就可以处理这些事件,事件的例子有如 ...
- 修改activityMQ的登录账与密码
登录下管理员页面,ip根据实际的来 URL : http://127.0.0.1:8161/admin/ 默认账户密码都是admin 账户密码修改在conf文件夹下的jetty-realm.prope ...
- 【shiro】报错:Caused by: java.lang.ClassNotFoundException: org.apache.shiro.spring.LifecycleBeanPostProcessor
Caused by: java.lang.ClassNotFoundException: org.apache.shiro.spring.LifecycleBeanPostProcessor at o ...
- jQuery中,选择器既匹配开头又匹配结尾
jQuery中,选择器既匹配开头又匹配结尾的方法: [attr^=val]attr$=val [attr^=val][attr$=val]
- ISP图像调试工程师——对比度增强(熟悉图像预处理和后处理技术)
经典对比度增强算法: http://blog.csdn.net/ebowtang/article/details/38236441