1. 程式人生 > >一個簡單的java桌面應用:單機版IFTTT

一個簡單的java桌面應用:單機版IFTTT

1.專案背景:

ifttt是“if this then that”的縮寫,事實上是讓你的網路行為能夠引發連鎖反應、讓你使用更為方便。ifttt旨在幫助人們利用各網站的開放API,將各個網站或應用銜接,完成任務。ifttt通過流程將各種資訊串聯起來,然後再集中把你要的資訊呈現給你。解決了資訊的冗雜,收取或關注重要資訊的問題。

2.專案簡介:

本專案是由java編寫的一款基於觸發器-動作框架的IFTTT視窗程式。
使用者可以指定this和that事件。當應用監測到this事件發生時,將自動執行that事件。

  • 當前可供選擇的this事件有:
    1. 定時器
    2. 指定的QQ郵箱收到郵件(可指定發件人郵箱包含某一子串)
  • 當前可供選擇的that事件有:
    1. 通過QQ郵箱傳送郵件
    2. 釋出新浪微博

3.專案分析:

專案結構

本專案主要包括三個模組:

  1. UI模組
    UI模組定義了各種視窗,提供了友好的使用者介面,並對使用者的操作作出響應。
  2. task模組
    task模組主要有兩方面功能。
    • 管理資料。task模組記錄各個任務的資訊,並提供訪問、新增、刪除任務的介面。
    • 執行任務。收到使用者請求後,task模組講在後臺執行指定任務。
  3. database模組
    database模組提供了將任務資訊轉換並存儲的方法與將任務資訊讀取並解析的方法。
    • 在程式啟動時,從database中讀取上一次儲存的任務資訊。
    • 在程式終止時,當前的任務資訊將儲存到database中。

檔案結構

src

  • ifttt
    ifttt.java//程式入口
  • task
    TaskManager.java//任務管理類
    TaskHandler.java//任務執行類
    Task.java//任務類
    ThisClock.java//子任務類,this事件–定時器
    ThisMail.java//子任務類,this事件–收到郵件
    ThatMail.java//子任務類,that事件–發郵件
    ThatWeibo.java//子任務類,that事件–發微博
  • ui
    ClockPanel.java//通用控制元件
    MailReceivedPanel.java//通用控制元件
    TaskPanel.java//通用控制元件
    • mainWindow
      MainWindow.java//視窗:主介面
    • editTask
      EditTaskPanel.java//繼承自TaskPanel.java
      EditTaskWindow.java//視窗:編輯任務
    • newTask
      NewTaskPanel.java//繼承自TaskPanel.java
      NewTaskWindow.java//視窗:新建任務
    • help
      AboutWindow.java//視窗:關於
      InstractionWindow.java//視窗:使用說明
    • weibo
      WeiboOauth.java//視窗:進行微博授權
    • database
      SqliteDB.java//資料庫讀寫類
    • weibo4j
      //新浪微博SDK

執行流程

開啟程式

程式從ifttt.java中的main函式開始執行。
main函式做了三件事:

  1. 呼叫TaskManager的initial方法。
    這個方法初始化了tasklist與threadlist。並呼叫SqliteDB.readDB,將資料庫中的資訊讀入tasklist中。
    tasklist維護了一個當前已有任務的序列。(由於每個任務的執行需要新建一個單獨的執行緒,因此建立一個與tasklist一一對應的threadlist。)
  2. 使用substance進行介面美化。
    這是java swing的一個開源面板包。只要進行簡單的設定就可以美化介面。
  3. 開啟mainwindow。
    主介面mainwindow開啟後,使用者將通過mainwindow控制程式。

MainWindow

  • mainwindow的menubar中有兩個選項,任務和幫助。
    • 任務選項下有兩個選擇,新建任務與編輯任務(刪除任務的功能整合在編輯任務中)。
    • 幫助選項下有兩個選擇,使用說明與關於。點選這兩個按鈕彈出的都是隻包含文字的視窗。提供了相關資訊。
  • 主介面中有一個combobox控制元件,可以從中選擇已有任務。
  • 一個開始按鈕與一個停止按鈕可以對任務進行控制。
  • 兩個不可編輯的文字框,一個顯示當前任務的具體描述,一個顯示正在執行的任務的執行狀況。
    mainwindow關閉時,將觸發監聽器,執行SqliteDB.saveDB方法,將已有的任務儲存到資料庫中後退出程式。

新建任務

新建任務視窗
使用者點選新建任務,將開啟新建任務視窗。
新建任務視窗中,使用者可以填入任務名稱,選擇this子任務的型別,that子任務的型別。
選擇不同的子任務時,介面外觀將發生改變,供使用者填入適當內容。
微博認證視窗

  • 微博認證
    • 選擇傳送微博的子任務時,會出現一個微博授權按鈕,點選微博授權按鈕,將彈出一個新的視窗。
    • 在微博認證視窗中,點選開始認證,將開啟瀏覽器進入應用授權介面。授權成功後將跳轉到百度首頁,將位址列的code內容複製到本視窗中。
    • 點選確認,授權成功。
      由於本應用是未稽核應用,因此每次授權有效期僅為24小時。

新建任務視窗下方有三個按鈕,分別為確定、重置、取消。

  • 點選重置按鈕,視窗將恢復初始狀態。
  • 點選取消按鈕,視窗將關閉。
  • 點選確定按鈕,將執行新建任務邏輯。
    • 監聽器呼叫NewTaskWindow.newTask(),
    • 傳入相關資料,新建一個Task物件,
    • 通過TaskManager.addTask()方法將新建的task加入tasklist中。
    • threadlist將同步擴充套件,新增一個null項。
    • 通知mainwindow新增任務,重新整理介面。
    • 關閉新建任務視窗。

編輯任務

EditTaskWindow
編輯任務介面與新建任務介面基本相同。

  • 多出一個選擇任務的box。選擇任務後,介面將變化,自動填入選中任務的資訊。
  • 多出一個刪除按鈕。
    點選刪除,將呼叫TaskManager.deleteTask()方法,刪除選中的任務。threadlist中的對應項也將被刪除。
  • 點選確定按鈕,將執行編輯任務邏輯。
    • 刪除tasklist中的原task。
    • 生成新的task,插入tasklist的對應位置。
    • 通知mainwindow更新任務。
    • 關閉編輯任務視窗。

4.任務邏輯

執行任務:

主介面點選執行任務,執行按鈕將變為不可點選,停止按鈕將變為可以點選。
呼叫taskmanager.starttask()方法,執行指定任務。
此方法將標記當前任務為running狀態,新建一個執行緒,線上程中新建taskhandler物件執行任務。
remove掉threadlist中原來的執行緒(也可能為null),插入剛剛建立的執行緒。
呼叫thread.start()執行此執行緒。
taskhandler通過task.getThisAction獲得this子任務,判斷this的任務型別,執行this子任務。

this子任務:定時器

  • 呼叫thisClock.doTask執行任務。
    • 新建TimerTask,內容為執行taskHandler.doThatTask,執行that子任務。
    • 新建Timer物件,將TimerTask加入Timer,並設定時間。返回。

this子任務:接收郵件。

呼叫thisMail.doTask執行任務。

  • 通過pop3協議連線QQ郵箱的pop3伺服器。
  • 每隔一定時間,遍歷郵件列表,從新往舊。
    • 當遇到上一次遍歷過的郵件或者遇到任務開始時間之前的郵件即完成一次遍歷。
    • 發現滿足條件的郵件時,跳出迴圈,執行taskHandler.doThatTask,執行that子任務。

that子任務:發郵件

Java基於smtp與pop3實現收發郵件的功能
- 呼叫thatMail.doTask執行任務。
- 通過SMTP協議登入QQ郵箱的SMTP伺服器。
- 傳送郵件。返回。

that子任務:發微博

Java基於新浪微博SDK實現發微博的功能
- 微博授權時,使用者填入code。應用即獲取access_token。
- 用access_token傳送微博。
- 任務結束後,將呼叫TaskManager.taskEnd()方法。
- 將當前task的狀態設定為notRunning。並通知mainwindow執行updateMainWindow更新介面。

停止任務:

  • 主介面點選停止任務,執行按鈕將變為可以點選,停止按鈕將變為不可點選。
  • 呼叫TaskManager的stopTask方法。
    • 此方法將判斷this子任務的型別。
    • 如果是定時器任務,將呼叫thisClock的stopTask方法。
      • 此方法中,執行timer.cancel()取消任務。
    • 如果是接收郵件任務,將執行thread.interrupt方法傳遞中斷請求。
      • 如果thread在sleep,將丟擲一個exception,在異常處理中結束此任務。
      • 如果thread在執行,在下一次判斷interruped狀態時將會結束(每一次遍歷郵件列表將會判斷是否有中斷請求)。

資料庫存取的實現:

具體請參考:Java將物件直接在資料庫中存取的方法
task類及四個子任務類都實現了Serializable介面。

  • 儲存:
    • 遍歷tasklist,將task序列化,輸出到一個byte型別的陣列中。
    • 將這個陣列存入資料庫中。
  • 讀取:
    • 遍歷資料庫,將每一條記錄讀到一個byte型別陣列中。
    • 將這個陣列反序列化轉為task物件。
    • 加入tasklist。

總結

到這裡,這個專案大體上已經介紹完畢。收發郵件、發微博、資料庫這三個部分我會再寫三篇詳細介紹,並在本文中貼出地址。
有疑問歡迎聯絡[email protected]交流。

相關推薦

一個簡單java桌面應用單機IFTTT

1.專案背景: ifttt是“if this then that”的縮寫,事實上是讓你的網路行為能夠引發連鎖反應、讓你使用更為方便。ifttt旨在幫助人們利用各網站的開放API,將各個網站或應用銜接,完成任務。ifttt通過流程將各種資訊串聯起來

java桌面應用解決開關按鈕只能使用一次的問題

最近在使用java倒騰某個工具的介面,做了個button(開啟關閉按鈕),可最後 只能執行一次,再執行就無效了 頭疼了幾天,今天 終於找到解決的辦法了,(;′⌒`)(;′⌒`)   趕緊記錄一下。 使用普通的按鈕JButton 無法實現開關按鈕模式;需使用Swing中JTo

一個簡單Java多線程的應用

accept NPU from rop import ati .get bytes system import java.net.*;import java.io.*;public class simpleServer{private static ServerSocket

Flask學習筆記建立一個簡單的Flask應用

1. 做好準備工作進入專案主目錄啟用虛擬環境2. 建立app包:在flask中,含有名為 __init__.py 檔案的子目錄被視為包,可以被匯入。在命令列輸入以下命令,建立一個名為app的目錄:(venv) $ mkdir app在app目錄中建立一個名為__init__.

我的第一個Java桌面應用

要想做一個Java桌面應用,必須要有一個簡單但又系統的使用者圖形介面,然後再處理桌面應用,其實這裡很簡單,遵循以下步驟即可: (1)在你的控制檯裡面,跑到你.java檔案的根目錄底下,Javac xxx.java看能不能編譯出.class檔案,可以的話繼續。 (2)在控制檯

DAV入門之kivy一個簡單的kivy應用

這裡我們採用PyCharm作為開發環境,先介紹下鄙人做的一個示例的庫,取名叫做kivy_cracker,意味著我將一步一步的將kivy擊破(手動剪刀手),這個庫包含了後面我更新的內容以及官網的示例:https://gitee.com/davied9/kivy_cracker.

WCF學習——構建一個簡單的WCF應用(一)

frame port app 位置 協定 enc splay msdn ons 本文的WCF服務應用功能很簡單,卻涵蓋了一個完整WCF應用的基本結構。希望本文能對那些準備開始學習WCF的初學者提供一些幫助。 在這個例子中,我們將實現一個簡單的計算器和傳統的分布式通信框架一樣

使用MyEclipse開發Java EE應用用XDoclet創建EJB 2 Session Bean項目(三)

str 文件存儲 字段 des 管理 新版 enter ecif class MyEclipse限時秒殺!活動火熱開啟中>> 【MyEclipse最新版下載】 三、配置XDoclet支持的項目 默認情況下,MyEclipse EJB項目未配置使用XDocle

使用MyEclipse開發Java EE應用EJB項目開發初探(上)

編輯器 應用服務器 工具 xdoclet 屬性 ctu xdoc 直接 project 你開學,我放價!MyEclipse線上狂歡繼續!火熱開啟中>> 【MyEclipse最新版下載】 一、MyEclipse EJB開發工具 Enterprise Java

使用MyEclipse開發Java EE應用EJB項目開發初探(下)

計時 包含 devel 開啟 有關 中文 ren 向導 all 你開學,我放價!MyEclipse線上狂歡繼續!火熱開啟中>> 【MyEclipse最新版下載】 三、EJB 3.x項目中的持久性支持 當創建EJB 3.x項目時,作為選項您可以添加JPA支持。

一個簡單的flask應用

啟動服務 show 裝飾 hello 調試器 href deb ref 動態變量 一個簡單的flask應用,文件名hello.py from flask import Flask app = Flask(__name__) @app.route(‘/‘) def

編寫一個簡單的Web應用

AC info 覆蓋 圖片 ram cnblogs 類目 基於 div 上一篇我們搭建了一個簡單的Web應用:http://www.cnblogs.com/lay2017/p/8468515.html 本文將基於上一篇搭建的應用,編寫一些內容 編寫Servlet類 編寫J

Java高階應用執行緒池全面解析

  什麼是執行緒池?   很簡單,簡單看名字就知道是裝有執行緒的池子,我們可以把要執行的多執行緒交給執行緒池來處理,和連線池的概念一樣,通過維護一定數量的執行緒池來達到多個執行緒的複用。   執行緒池的好處 &n

SpringBoot教程(一)一個簡單的springboot應用啟動和配置

一.配置和啟動第一個簡單的Springboot應用 (1)使用idea建立springboot專案 (2)工程結構 (3)配置檔案pom <?xml version="1.0" encoding="UTF-8"?> <project xm

使用Vue做一個簡單的todo應用的三種方式的示例程式碼

這篇文章主要介紹了使用Vue做一個簡單的todo應用的三種方式的示例程式碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧   1. 引用vue.js `<!DOCTYPE html>` `<html>` `<head>`

Webpack4 入門到帶你打包一個簡單單頁應用專案

正文前先吐槽下, webpack 對新手入門真的有點不友好,各個版本在配置上都有或多或少的差異,導致在對照各種教程學習的過程中免不了掉進各種坑裡,所以寫這篇文章旨在簡單明瞭的解釋說明 webpack 的各種常用配置,希望能讓新人接觸 webpack 時少走些彎

一個簡單的shell指令碼一鍵部署tomcat及釋出簡單程式指令碼

測試環境中一鍵部署的一個小指令碼,這裡記錄下,方便想聯絡的人進行參考 環境介紹: 作業系統cos7.4 jdk版本:1.8 中介軟體服務版本:tomcat7.0.75 ——————————————以下是指令碼內容—————————————————————————

一個簡單的shell指令碼weblogic日誌按天生成(日誌壓縮)

編寫目的: 在實際工作中,由於生產環境在出現問題的時候,中介軟體服務會出現大量的報錯日誌,若日誌增長量極大的情況下,會出現磁碟空間被寫滿的情況而導致宕機,為了防止此情況出現,編寫如下shell指令碼進行規避此問題。 注意: <一>本例已weblogi

ArcGIS Engine10.0輕鬆入門級教程(2)——建立一個ArcGIS Engine桌面應用程式 ArcGIS Engine10.0輕鬆入門級教程(3)——ArcEngine10.0查詢分析功能 ArcGIS Engine— 學習圖層符號化

ArcGIS Engine10.0輕鬆入門級教程(1)——必備基礎知識 ArcGIS Engine10.0輕鬆入門級教程(2)——建立一個ArcGIS Engine桌面應用程式 ArcGIS Engine10.0輕鬆入門級教程(3)——ArcEngine

一個簡單Java zip類壓縮原始碼

package com.zip; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i