天天看点

人工智能初体验(二):开发简单的图灵智能聊天工具

一 API Key申请

申请地址:http://www.tuling123.com/

中间的注册登录过程不说,最后把API Key值记录下来

<a href="http://s4.51cto.com/wyfs02/M00/78/5F/wKioL1Z6wKnBTZM-AACsrY_4uSo226.png" target="_blank"></a>

二 核心功能开发

这个小项目的目录结构:

<a href="http://s2.51cto.com/wyfs02/M01/78/60/wKiom1Z6wLqQcmKIAAAUJMMUXq4852.png" target="_blank"></a>

核心功能文件TuringRobot.java,代码很简单,一看就明白,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

<code>package</code> <code>action;</code>

<code>import</code> <code>java.io.BufferedReader;</code>

<code>import</code> <code>java.io.IOException;</code>

<code>import</code> <code>java.io.InputStream;</code>

<code>import</code> <code>java.io.InputStreamReader;</code>

<code>import</code> <code>java.io.UnsupportedEncodingException;</code>

<code>import</code> <code>java.net.HttpURLConnection;</code>

<code>import</code> <code>java.net.MalformedURLException;</code>

<code>import</code> <code>java.net.URL;</code>

<code>import</code> <code>java.net.URLEncoder;</code>

<code>import</code> <code>java.util.regex.Matcher;</code>

<code>import</code> <code>java.util.regex.Pattern;</code>

<code>public</code> <code>class</code> <code>TuringRobot {</code>

<code>    </code><code>/**</code>

<code>     </code><code>* 使用图灵机器人接口获取回答</code>

<code>     </code><code>* </code>

<code>     </code><code>* @param apikey API认证</code>

<code>     </code><code>* @param info 想要请求的问题</code>

<code>     </code><code>* @return 获取的回复</code>

<code>     </code><code>* */</code>

<code>    </code><code>public</code> <code>static</code> <code>String getResponse(String apikey,String info){</code>

<code>        </code><code>String httpUrl;</code>

<code>        </code><code>try</code> <code>{</code>

<code>            </code><code>httpUrl = </code><code>"http://www.tuling123.com/openapi/api?key="</code> <code>+ apikey + </code><code>"&amp;info="</code> <code>+ URLEncoder.encode(info,</code><code>"UTF-8"</code><code>);</code>

<code>            </code><code>URL url = </code><code>new</code> <code>URL(httpUrl);</code>

<code>            </code><code>HttpURLConnection connection = (HttpURLConnection) url.openConnection();</code>

<code>            </code><code>connection.setRequestMethod(</code><code>"GET"</code><code>);</code>

<code>            </code><code>connection.setReadTimeout(</code><code>5000</code><code>);</code>

<code>            </code><code>connection.setConnectTimeout(</code><code>5000</code><code>);</code>

<code>            </code> 

<code>            </code><code>InputStream inputStream = connection.getInputStream();</code>

<code>            </code><code>BufferedReader reader = </code><code>new</code> <code>BufferedReader(</code><code>new</code> <code>InputStreamReader(inputStream,</code><code>"UTF-8"</code><code>));</code>

<code>            </code><code>String line = </code><code>""</code><code>;</code>

<code>            </code><code>String reg = </code><code>"\"text\":\"(.*)?\"}"</code><code>;</code>

<code>            </code><code>Pattern pattern = Pattern.compile(reg);</code>

<code>            </code><code>Matcher matcher;</code>

<code>            </code><code>while</code><code>((line = reader.readLine()) != </code><code>null</code><code>){</code>

<code>                </code><code>matcher = pattern.matcher(line);</code>

<code>                </code><code>if</code><code>(matcher.find()){</code>

<code>                    </code><code>connection.disconnect();</code>

<code>                    </code><code>return</code> <code>matcher.group(</code><code>1</code><code>);</code>

<code>                </code><code>}</code>

<code>            </code><code>}</code>

<code>            </code><code>connection.disconnect();   </code>

<code>        </code><code>} </code><code>catch</code> <code>(UnsupportedEncodingException e1) {</code>

<code>            </code><code>e1.printStackTrace();</code>

<code>        </code><code>} </code><code>catch</code> <code>(MalformedURLException e) {</code>

<code>            </code><code>e.printStackTrace();</code>

<code>        </code><code>} </code><code>catch</code> <code>(IOException e) {</code>

<code>        </code><code>}</code>

<code>        </code><code>return</code> <code>""</code><code>;</code>

<code>    </code><code>}</code>

<code>    </code> 

<code>     </code><code>* 使用百度接口获取回答</code>

<code>     </code><code>* @param key 默认值:879a6cb3afb84dbf4fc84a1df2ab7319</code>

<code>     </code><code>* @param ApiKey 在APIStore调用服务所需要的API密钥,申请地址:http://apistore.baidu.com</code>

<code>     </code><code>* @param userid 用户id 默认值:eb2edb736</code>

<code>    </code><code>public</code> <code>static</code> <code>String getResponse(String key,String ApiKey,String info,String userid){</code>

<code>        </code><code>String httpUrl = </code><code>"http://apis.baidu.com/turing/turing/turing?"</code><code>;</code>

<code>            </code><code>info = URLEncoder.encode(info,</code><code>"UTF-8"</code><code>);  </code>

<code>        </code><code>String httpArg = </code><code>"key="</code> <code>+ key + </code><code>"&amp;info="</code> <code>+ info + </code><code>"&amp;userid="</code> <code>+ userid;</code>

<code>            </code><code>URL url = </code><code>new</code> <code>URL(httpUrl + httpArg);</code>

<code>            </code><code>connection.setRequestProperty(</code><code>"apikey"</code><code>, ApiKey);</code>

<code>            </code><code>String reg = </code><code>"\"text\":\"(.*)?\",\"code\""</code><code>;</code>

<code>            </code><code>}  </code>

<code>            </code><code>connection.disconnect();</code>

<code>        </code> 

<code>}</code>

三 前台界面开发

在界面开发中有几个关键点需要注意:

(1)使用了新的线程来执行数据获取过程,并且通过SwingUtilities.invokeLater()来通知EDT更新界面。具体技术可以参考我写的这篇文章:http://www.zifangsky.cn/2015/12/java中事件分发线程(edt)与swingutilities-invokelater相关总结/

(2)本来最开始是使用了JTextArea来显示聊天记录,后来发现不能对聊天双方的记录分别左对齐和右对齐,而且也不能对聊天记录中的文字颜色和字体进行个性化设置,因此后来将聊天界面的JTextArea改成了JTextPane。这是一个强大的控件,我这里仅仅只是进行了简单使用,看代码就明白了

(3)API Key保存在配置文件config/config.txt中了

<a href="http://s1.51cto.com/wyfs02/M02/78/60/wKiom1Z6wWCxse0VAACqxU87uhk974.png" target="_blank"></a>

界面代码如下:

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

<code>package</code> <code>view;</code>

<code>import</code> <code>java.awt.BorderLayout;</code>

<code>import</code> <code>java.awt.Color;</code>

<code>import</code> <code>java.awt.Dimension;</code>

<code>import</code> <code>java.awt.FlowLayout;</code>

<code>import</code> <code>java.awt.Font;</code>

<code>import</code> <code>java.awt.Toolkit;</code>

<code>import</code> <code>java.awt.event.ActionEvent;</code>

<code>import</code> <code>java.awt.event.ActionListener;</code>

<code>import</code> <code>java.awt.event.KeyEvent;</code>

<code>import</code> <code>java.awt.event.KeyListener;</code>

<code>import</code> <code>java.awt.event.WindowEvent;</code>

<code>import</code> <code>java.awt.event.WindowListener;</code>

<code>import</code> <code>java.io.File;</code>

<code>import</code> <code>java.io.FileNotFoundException;</code>

<code>import</code> <code>java.io.FileReader;</code>

<code>import</code> <code>java.text.Format;</code>

<code>import</code> <code>java.text.SimpleDateFormat;</code>

<code>import</code> <code>java.util.Date;</code>

<code>import</code> <code>javax.swing.JButton;</code>

<code>import</code> <code>javax.swing.JFrame;</code>

<code>import</code> <code>javax.swing.JMenu;</code>

<code>import</code> <code>javax.swing.JMenuBar;</code>

<code>import</code> <code>javax.swing.JMenuItem;</code>

<code>import</code> <code>javax.swing.JOptionPane;</code>

<code>import</code> <code>javax.swing.JPanel;</code>

<code>import</code> <code>javax.swing.JScrollPane;</code>

<code>import</code> <code>javax.swing.JTextArea;</code>

<code>import</code> <code>javax.swing.JTextPane;</code>

<code>import</code> <code>javax.swing.SwingUtilities;</code>

<code>import</code> <code>javax.swing.text.BadLocationException;</code>

<code>import</code> <code>javax.swing.text.DefaultStyledDocument;</code>

<code>import</code> <code>javax.swing.text.MutableAttributeSet;</code>

<code>import</code> <code>javax.swing.text.SimpleAttributeSet;</code>

<code>import</code> <code>javax.swing.text.StyleConstants;</code>

<code>import</code> <code>action.TuringRobot;</code>

<code>public</code> <code>class</code> <code>MainView </code><code>extends</code> <code>JFrame </code><code>implements</code> <code>ActionListener, WindowListener, KeyListener{</code>

<code>     </code><code>* @author zifangsky</code>

<code>     </code><code>* @blog www.zifangsky.cn</code>

<code>     </code><code>* @date 2015-12-21</code>

<code>     </code><code>* @version v1.0.0</code>

<code>    </code><code>private</code> <code>static</code> <code>final</code> <code>long</code> <code>serialVersionUID = 1L;</code>

<code>    </code><code>private</code> <code>JPanel mainJPanel,tipJPanel;</code>

<code>    </code><code>private</code> <code>JScrollPane message_JScrollPane,edit_JScrollPane;</code>

<code>    </code><code>private</code> <code>JTextArea edit_JTextArea;</code>

<code>    </code><code>private</code> <code>JButton close,submit;</code>

<code>    </code><code>private</code> <code>JTextPane messageJTextPane;</code>

<code>    </code><code>private</code> <code>DefaultStyledDocument doc;</code>

<code>    </code><code>private</code> <code>JMenuBar jMenuBar;</code>

<code>    </code><code>private</code> <code>JMenu help;</code>

<code>    </code><code>private</code> <code>JMenuItem author,contact,version,readme;</code>

<code>    </code><code>private</code> <code>Font contentFont = </code><code>new</code> <code>Font(</code><code>"宋体"</code><code>, Font.LAYOUT_NO_LIMIT_CONTEXT, </code><code>16</code><code>);  </code><code>//正文字体</code>

<code>    </code><code>private</code> <code>Font menuFont = </code><code>new</code> <code>Font(</code><code>"宋体"</code><code>, Font.LAYOUT_NO_LIMIT_CONTEXT, </code><code>14</code><code>);  </code><code>//菜单字体</code>

<code>    </code><code>private</code> <code>Color buttonColor = </code><code>new</code> <code>Color(</code><code>85</code><code>,</code><code>76</code><code>,</code><code>177</code><code>);  </code><code>//按钮背景色</code>

<code>    </code><code>Color inputColor1 = </code><code>new</code> <code>Color(</code><code>31</code><code>,</code><code>157</code><code>,</code><code>255</code><code>);  </code><code>//输入相关颜色</code>

<code>    </code><code>Color inputColor2 = </code><code>new</code> <code>Color(</code><code>51</code><code>,</code><code>51</code><code>,</code><code>51</code><code>);  </code><code>//输入相关颜色</code>

<code>    </code><code>Color outputColor1 = </code><code>new</code> <code>Color(</code><code>0</code><code>,</code><code>186</code><code>,</code><code>4</code><code>);  </code><code>//返回相关颜色</code>

<code>    </code><code>Color outputColor2 = </code><code>new</code> <code>Color(</code><code>51</code><code>,</code><code>51</code><code>,</code><code>51</code><code>);  </code><code>//返回相关颜色</code>

<code>    </code><code>private</code> <code>DataOperating dataOperating = </code><code>null</code><code>;  </code><code>//数据操作线程</code>

<code>    </code><code>private</code> <code>Runnable updateInputInterface,updateResponseInterface;  </code><code>//更新界面线程</code>

<code>    </code><code>private</code> <code>String inputString = </code><code>""</code><code>,responseString = </code><code>""</code><code>; </code>

<code>    </code><code>private</code> <code>String key = </code><code>""</code><code>;  </code>

<code>    </code><code>public</code> <code>MainView(){</code>

<code>        </code><code>super</code><code>(</code><code>"图灵智能聊天"</code><code>);</code>

<code>        </code><code>Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();</code>

<code>        </code><code>screenSize = Toolkit.getDefaultToolkit().getScreenSize();  </code><code>//屏幕大小</code>

<code>        </code><code>setPreferredSize(</code><code>new</code> <code>Dimension(</code><code>350</code><code>, </code><code>600</code><code>));</code>

<code>        </code><code>int</code> <code>frameWidth = </code><code>this</code><code>.getPreferredSize().width;  </code><code>//界面宽度</code>

<code>        </code><code>int</code> <code>frameHeight = </code><code>this</code><code>.getPreferredSize().height;  </code><code>//界面高度</code>

<code>        </code><code>setSize(frameWidth,frameHeight);</code>

<code>        </code><code>setLocation((screenSize.width - frameWidth) / </code><code>2</code><code>,(screenSize.height - frameHeight) / </code><code>2</code><code>);</code>

<code>        </code><code>//初始化</code>

<code>        </code><code>mainJPanel = </code><code>new</code> <code>JPanel();</code>

<code>        </code><code>tipJPanel = </code><code>new</code> <code>JPanel();</code>

<code>        </code><code>message_JScrollPane = </code><code>new</code> <code>JScrollPane();</code>

<code>        </code><code>edit_JScrollPane = </code><code>new</code> <code>JScrollPane();</code>

<code>        </code><code>messageJTextPane = </code><code>new</code> <code>JTextPane();</code>

<code>        </code><code>doc = </code><code>new</code> <code>DefaultStyledDocument();</code>

<code>        </code><code>edit_JTextArea = </code><code>new</code> <code>JTextArea(</code><code>5</code><code>, </code><code>10</code><code>);</code>

<code>        </code><code>close = </code><code>new</code> <code>JButton(</code><code>"关闭"</code><code>);</code>

<code>        </code><code>submit = </code><code>new</code> <code>JButton(</code><code>"发送"</code><code>);     </code>

<code>        </code><code>jMenuBar = </code><code>new</code> <code>JMenuBar();</code>

<code>        </code><code>help = </code><code>new</code> <code>JMenu(</code><code>"帮助"</code><code>);</code>

<code>        </code><code>author = </code><code>new</code> <code>JMenuItem(</code><code>"作者"</code><code>);</code>

<code>        </code><code>contact = </code><code>new</code> <code>JMenuItem(</code><code>"联系方式"</code><code>);</code>

<code>        </code><code>version = </code><code>new</code> <code>JMenuItem(</code><code>"版本"</code><code>);</code>

<code>        </code><code>readme = </code><code>new</code> <code>JMenuItem(</code><code>"说明"</code><code>);</code>

<code>        </code><code>//设置字体</code>

<code>        </code><code>messageJTextPane.setFont(contentFont);</code>

<code>        </code><code>edit_JTextArea.setFont(contentFont);</code>

<code>        </code><code>close.setFont(contentFont);</code>

<code>        </code><code>submit.setFont(contentFont);</code>

<code>        </code><code>help.setFont(menuFont);</code>

<code>        </code><code>author.setFont(menuFont);</code>

<code>        </code><code>contact.setFont(menuFont);</code>

<code>        </code><code>version.setFont(menuFont);</code>

<code>        </code><code>readme.setFont(menuFont);</code>

<code>        </code><code>//布局</code>

<code>        </code><code>mainJPanel.setLayout(</code><code>new</code> <code>BorderLayout());</code>

<code>        </code><code>mainJPanel.add(message_JScrollPane,BorderLayout.NORTH);</code>

<code>        </code><code>mainJPanel.add(edit_JScrollPane,BorderLayout.CENTER);</code>

<code>        </code><code>mainJPanel.add(tipJPanel,BorderLayout.SOUTH);</code>

<code>        </code><code>messageJTextPane.setPreferredSize(</code><code>new</code> <code>Dimension(</code><code>350</code><code>, </code><code>350</code><code>));</code>

<code>        </code><code>messageJTextPane.setBackground(</code><code>new</code> <code>Color(</code><code>204</code><code>,</code><code>232</code><code>,</code><code>207</code><code>));</code>

<code>        </code><code>message_JScrollPane.getViewport().add(messageJTextPane);</code>

<code>        </code><code>edit_JScrollPane.getViewport().add(edit_JTextArea);</code>

<code>        </code><code>edit_JTextArea.setBackground(</code><code>new</code> <code>Color(</code><code>204</code><code>,</code><code>232</code><code>,</code><code>207</code><code>));</code>

<code>        </code><code>edit_JTextArea.requestFocus();</code>

<code>        </code><code>tipJPanel.setLayout(</code><code>new</code> <code>FlowLayout(FlowLayout.RIGHT, </code><code>10</code><code>, </code><code>10</code><code>));</code>

<code>        </code><code>tipJPanel.add(close);</code>

<code>        </code><code>tipJPanel.add(submit);</code>

<code>        </code><code>close.setBackground(buttonColor);</code>

<code>        </code><code>close.setForeground(Color.WHITE);</code>

<code>        </code><code>submit.setBackground(buttonColor);</code>

<code>        </code><code>submit.setForeground(Color.WHITE);</code>

<code>        </code><code>messageJTextPane.setEditable(</code><code>false</code><code>);</code>

<code>        </code><code>edit_JTextArea.setLineWrap(</code><code>true</code><code>);</code>

<code>        </code><code>edit_JTextArea.setWrapStyleWord(</code><code>true</code><code>);</code>

<code>        </code><code>jMenuBar.add(help);</code>

<code>        </code><code>help.add(author);</code>

<code>        </code><code>help.add(contact);</code>

<code>        </code><code>help.add(version);</code>

<code>        </code><code>help.add(readme);</code>

<code>        </code><code>add(mainJPanel);</code>

<code>        </code><code>setJMenuBar(jMenuBar);</code>

<code>        </code><code>setVisible(</code><code>true</code><code>);</code>

<code>        </code><code>setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</code>

<code>        </code><code>addWindowListener(</code><code>this</code><code>);</code>

<code>        </code><code>//获取配置文件中的配置信息</code>

<code>            </code><code>BufferedReader reader = </code><code>new</code> <code>BufferedReader(</code><code>new</code> <code>FileReader(</code><code>new</code> <code>File(</code><code>"config/config.txt"</code><code>)));</code>

<code>            </code><code>String line = reader.readLine();  </code><code>//第一行不要</code>

<code>            </code><code>Pattern pattern = Pattern.compile(</code><code>"key=(.*)?"</code><code>);</code>

<code>                </code><code>if</code><code>(matcher.find())</code>

<code>                    </code><code>key = matcher.group(</code><code>1</code><code>);</code>

<code>                </code><code>break</code><code>; </code>

<code>            </code><code>reader.close();</code>

<code>        </code><code>} </code><code>catch</code> <code>(FileNotFoundException e) {</code>

<code>        </code><code>//点击事件</code>

<code>        </code><code>close.addActionListener(</code><code>this</code><code>);</code>

<code>        </code><code>submit.addActionListener(</code><code>this</code><code>);</code>

<code>        </code><code>author.addActionListener(</code><code>this</code><code>);</code>

<code>        </code><code>contact.addActionListener(</code><code>this</code><code>);</code>

<code>        </code><code>version.addActionListener(</code><code>this</code><code>);</code>

<code>        </code><code>readme.addActionListener(</code><code>this</code><code>);</code>

<code>        </code><code>//键盘时间</code>

<code>        </code><code>edit_JTextArea.addKeyListener(</code><code>this</code><code>);</code>

<code>        </code><code>//输入对话,提交后触发,更新界面</code>

<code>        </code><code>updateInputInterface = </code><code>new</code> <code>Runnable() {</code>

<code>            </code><code>public</code> <code>void</code> <code>run() {</code>

<code>                </code><code>messageJTextPane.setEditable(</code><code>true</code><code>);</code>

<code>                </code> 

<code>                </code><code>setInputString(</code><code>"我["</code> <code>+ getDateString() + </code><code>"]:"</code><code>, inputColor1, </code><code>true</code><code>, contentFont);</code>

<code>                </code><code>setInputString(inputString + </code><code>"\n"</code><code>, inputColor2, </code><code>false</code><code>, menuFont);</code>

<code>                </code><code>messageJTextPane.selectAll();</code>

<code>                </code><code>messageJTextPane.setCaretPosition(messageJTextPane.getSelectionEnd());</code>

<code>                </code><code>messageJTextPane.setEditable(</code><code>false</code><code>);</code>

<code>        </code><code>};</code>

<code>        </code><code>//获取到回答后触发,更新界面</code>

<code>        </code><code>updateResponseInterface = </code><code>new</code> <code>Runnable() {</code>

<code>                </code><code>setResponseString(</code><code>"智子["</code> <code>+ getDateString() + </code><code>"]:"</code><code>, outputColor1, </code><code>true</code><code>, contentFont);</code>

<code>                </code><code>setResponseString(responseString + </code><code>"\n"</code><code>, outputColor2, </code><code>false</code><code>, menuFont);</code>

<code>                </code><code>inputString = </code><code>""</code><code>;</code>

<code>                </code><code>responseString = </code><code>""</code><code>;</code>

<code>                </code><code>edit_JTextArea.setText(</code><code>""</code><code>);</code>

<code>                </code><code>edit_JTextArea.requestFocus();</code>

<code>                </code><code>dataOperating = </code><code>null</code><code>;</code>

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>

<code>        </code><code>SwingUtilities.invokeLater(</code><code>new</code> <code>Runnable() {</code>

<code>                </code><code>new</code> <code>MainView();</code>

<code>        </code><code>});</code>

<code>     </code><code>* 输入的信息在界面显示出来</code>

<code>    </code><code>private</code> <code>void</code> <code>setInputString(String str,Color color,</code><code>boolean</code> <code>bold,Font font){</code>

<code>        </code><code>MutableAttributeSet attributeSet = </code><code>new</code> <code>SimpleAttributeSet();</code>

<code>        </code><code>StyleConstants.setForeground(attributeSet, color);  </code><code>//设置文字颜色</code>

<code>        </code><code>if</code><code>(bold)</code>

<code>            </code><code>StyleConstants.setBold(attributeSet, </code><code>true</code><code>);  </code><code>//设置加粗</code>

<code>        </code><code>StyleConstants.setFontFamily(attributeSet, </code><code>"Consolas"</code><code>);  </code><code>//设置字体</code>

<code>        </code><code>StyleConstants.setFontSize(attributeSet, font.getSize());  </code><code>//设置字体大小</code>

<code>        </code><code>StyleConstants.setAlignment(attributeSet, StyleConstants.ALIGN_RIGHT);  </code><code>//左对齐</code>

<code>        </code><code>insertText(str,attributeSet);</code>

<code>     </code><code>* 返回的信息在界面显示出来</code>

<code>    </code><code>private</code> <code>void</code> <code>setResponseString(String str,Color color,</code><code>boolean</code> <code>bold,Font font){</code>

<code>        </code><code>StyleConstants.setForeground(attributeSet, color);</code>

<code>            </code><code>StyleConstants.setBold(attributeSet, </code><code>true</code><code>);</code>

<code>        </code><code>StyleConstants.setFontFamily(attributeSet, </code><code>"Consolas"</code><code>);</code>

<code>        </code><code>StyleConstants.setFontSize(attributeSet, font.getSize());</code>

<code>        </code><code>StyleConstants.setAlignment(attributeSet, StyleConstants.ALIGN_LEFT);</code>

<code>     </code><code>* 在JTextPane中插入文字</code>

<code>    </code><code>private</code> <code>void</code> <code>insertText(String str, MutableAttributeSet attributeSet) {</code>

<code>        </code><code>messageJTextPane.setStyledDocument(doc);</code>

<code>        </code><code>str += </code><code>"\n"</code><code>;</code>

<code>        </code><code>doc.setParagraphAttributes(doc.getLength(), str.length(), attributeSet, </code><code>false</code><code>);</code>

<code>            </code><code>doc.insertString(doc.getLength(), str, attributeSet);</code>

<code>        </code><code>} </code><code>catch</code> <code>(BadLocationException e) {</code>

<code>     </code><code>* 点击事件</code>

<code>    </code><code>public</code> <code>void</code> <code>actionPerformed(ActionEvent e) {</code>

<code>        </code><code>if</code><code>(e.getSource() == close){</code>

<code>            </code><code>System.exit(</code><code>0</code><code>);</code>

<code>        </code><code>else</code> <code>if</code><code>(e.getSource() == submit){</code>

<code>            </code><code>if</code><code>(dataOperating == </code><code>null</code><code>){</code>

<code>                </code><code>dataOperating = </code><code>new</code> <code>DataOperating();</code>

<code>                </code><code>new</code> <code>Thread(dataOperating).start();</code>

<code>        </code><code>else</code> <code>if</code><code>(e.getSource() == author){</code>

<code>            </code><code>JOptionPane.showMessageDialog(</code><code>this</code><code>, </code><code>"zifangsky"</code><code>,</code><code>"作者:"</code><code>,JOptionPane.INFORMATION_MESSAGE);</code>

<code>        </code><code>else</code> <code>if</code><code>(e.getSource() == contact){</code>

<code>            </code><code>JOptionPane.showMessageDialog(</code><code>this</code><code>, </code><code>"邮箱:[email protected]\n"</code> <code>+</code>

<code>                    </code><code>"博客:www.zifangsky.cn"</code><code>,</code><code>"联系方式:"</code><code>,JOptionPane.INFORMATION_MESSAGE);</code>

<code>        </code><code>else</code> <code>if</code><code>(e.getSource() == version){</code>

<code>            </code><code>JOptionPane.showMessageDialog(</code><code>this</code><code>, </code><code>"v1.0.0"</code><code>,</code><code>"版本号:"</code><code>,JOptionPane.INFORMATION_MESSAGE);</code>

<code>        </code><code>else</code> <code>if</code><code>(e.getSource() == readme){</code>

<code>            </code><code>JOptionPane.showMessageDialog(</code><code>this</code><code>, </code><code>"本程序只是简单的智能聊天,没有多余的功能。源码已经在我博客进行开源,\n"</code> <code>+</code>

<code>                    </code><code>"有需求的可以在此基础上进行APP开发,移植到Android平台上去。"</code><code>,</code><code>"说明:"</code><code>,JOptionPane.INFORMATION_MESSAGE);</code>

<code>     </code><code>* 具体的数据处理内部类</code>

<code>    </code><code>private</code> <code>class</code> <code>DataOperating </code><code>implements</code> <code>Runnable{</code>

<code>        </code><code>public</code> <code>void</code> <code>run() {</code>

<code>            </code><code>//获取输入</code>

<code>            </code><code>inputString = edit_JTextArea.getText().trim();</code>

<code>            </code><code>if</code><code>(inputString == </code><code>null</code> <code>|| </code><code>""</code><code>.equals(inputString))</code>

<code>                </code><code>return</code><code>;</code>

<code>            </code><code>SwingUtilities.invokeLater(updateInputInterface);</code>

<code>            </code><code>//获取回复</code>

<code>            </code><code>responseString = TuringRobot.getResponse(key, inputString);</code>

<code>            </code><code>SwingUtilities.invokeLater(updateResponseInterface);</code>

<code>     </code><code>* 获取当前时间的字符串</code>

<code>     </code><code>* @return 当前时间的字符串</code>

<code>    </code><code>private</code> <code>String getDateString(){</code>

<code>        </code><code>Date date = </code><code>new</code> <code>Date();</code>

<code>        </code><code>Format format = </code><code>new</code> <code>SimpleDateFormat(</code><code>"HH:mm:ss"</code><code>);</code>

<code>        </code><code>return</code> <code>format.format(date);               </code>

<code>    </code><code>public</code> <code>void</code> <code>windowOpened(WindowEvent e) {</code>

<code>    </code><code>public</code> <code>void</code> <code>windowClosing(WindowEvent e) {</code>

<code>        </code><code>System.exit(</code><code>0</code><code>);</code>

<code>    </code><code>public</code> <code>void</code> <code>windowClosed(WindowEvent e) {</code>

<code>    </code><code>public</code> <code>void</code> <code>windowIconified(WindowEvent e) {</code>

<code>    </code><code>public</code> <code>void</code> <code>windowDeiconified(WindowEvent e) {</code>

<code>    </code><code>public</code> <code>void</code> <code>windowActivated(WindowEvent e) {</code>

<code>    </code><code>public</code> <code>void</code> <code>windowDeactivated(WindowEvent e) {</code>

<code>    </code><code>public</code> <code>void</code> <code>keyTyped(KeyEvent e) {</code>

<code>     </code><code>* 键盘事件,键盘按下ENTER键触发</code>

<code>    </code><code>public</code> <code>void</code> <code>keyPressed(KeyEvent e) {</code>

<code>        </code><code>if</code><code>(e.getKeyCode() == KeyEvent.VK_ENTER){</code>

<code>    </code><code>public</code> <code>void</code> <code>keyReleased(KeyEvent e) {</code>

四 运行效果

<a href="http://s4.51cto.com/wyfs02/M02/78/5F/wKioL1Z6wbyiZlN2AACOPuFzQss301.png" target="_blank"></a>

<a href="http://s4.51cto.com/wyfs02/M00/78/5F/wKioL1Z6wcGA_YvgAACSu28BBqg995.png" target="_blank"></a>

本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1727742,如需转载请自行联系原作者