一、程序實現
- 項目目錄:
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大師代發,拒絕轉載,轉載需要作者授權