java frame canvas_自定义java.awt.Canvas—趣味聊天

本文介绍了使用Java Swing组件JFrame、Canvas以及Graphics绘制实现的一款简易趣味聊天应用。应用中,用户可以与模拟的‘会说话的汤姆猫’进行互动,通过欧拉蜜智能语音API获取回答。文章包含关键代码示例,如界面布局、事件监听和语义理解API的调用。
摘要由CSDN通过智能技术生成

最近用java模拟“会说话的汤姆猫”做了一个超级简陋的小程序。重点研究了一下JFrame(javax.swing.JFram)、SequentialGroup(javax.swing.GroupLayout.SequentialGroup)、ParallelGroup(javax.swing.GroupLayout. ParallelGroup)、Canvas(java.awt.Canvas)、Graphics(java.awt.Graphics)的使用。

程序效果如下: 欢迎大家下载这个小程序的可运行jar包!趣味聊天demo.jar

可以在问题框中输入任意问题与小猫对话。当输入问题时,小猫会做出聆听状态。

点击发送后,小猫做回答状态。对于各种问题的答案,这里调用的是欧拉蜜智能语音api,详情可参考http://cn.olami.ai

主要代码如下:

1、界面MyJFrame:

import java.awt.Canvas;

import java.awt.Color;

import java.awt.FlowLayout;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.Toolkit;

import java.awt.event.FocusEvent;

import java.awt.event.FocusListener;

import java.net.URL;

import javax.swing.GroupLayout.Alignment;

import javax.swing.GroupLayout;

import javax.swing.JButton;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;

import com.alibaba.fastjson.JSONObject;

public class MyJFrame extends javax.swing.JFrame {

private static final long serialVersionUID = 1L;

private NLIProcess nlp = new NLIProcess();

private JButton jButton_send;

private JLabel jLabel1;

private JLabel jLabel2;

private JPanel jPanel1;

private JPanel jPanel2;

private JTextField jTextField1;

private JTextField jTextField2;

private Image act1;

private Image act2;

// 初始图像编号

int actPhase = 1;

Canvas c = null;

public MyJFrame() {

getImage();

initComponents();

}

private void getImage(){

setBackground(Color.BLACK);

URL imageUrl = getClass().getResource("image/img0.png");

act1 = Toolkit.getDefaultToolkit().createImage(imageUrl);

imageUrl = getClass().getResource("image/img3.png");

act2 = Toolkit.getDefaultToolkit().createImage(imageUrl);

}

private void initComponents() {

jPanel1 = new JPanel();

jLabel1 = new JLabel();

jLabel2 = new JLabel();

jTextField1 = new JTextField();

jTextField2 = new JTextField();

jButton_send = new JButton();

jPanel2 = new JPanel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

setMinimumSize(new java.awt.Dimension(400, 300));

jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("智能问答"));

jLabel1.setText("问题:");

jLabel2.setText("回答:");

jTextField1.setText("你多大了?");

jTextField2.setEnabled(false);

jButton_send.setText("send");

jButton_send.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton_sendActionPerformed(evt);

}

});

jTextField1.addFocusListener(new FocusListener(){

@Override

public void focusGained(FocusEvent arg0) {

// TODO Auto-generated method stub

actPhase = 2;

c.repaint();

}

@Override

public void focusLost(FocusEvent arg0) {

// TODO Auto-generated method stub

actPhase = 1;

c.repaint();

}

});

GroupLayout jPanel1Layout = new GroupLayout(jPanel1);

GroupLayout.SequentialGroup hGroup = jPanel1Layout.createSequentialGroup();

hGroup.addGap(8);

hGroup.addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(jLabel1)

.addComponent(jLabel2));

hGroup.addGap(5);

hGroup.addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(jTextField1)

.addComponent(jTextField2));

hGroup.addGap(5);

hGroup.addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(jButton_send));

hGroup.addGap(8);

jPanel1Layout.setHorizontalGroup(hGroup);

GroupLayout.SequentialGroup vGroup = jPanel1Layout.createSequentialGroup();

vGroup.addGap(8);

vGroup.addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(jLabel1)

.addComponent(jTextField1).addComponent(jButton_send));

vGroup.addGap(3);

vGroup.addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(jLabel2)

.addComponent(jTextField2));

vGroup.addGap(8);

//设置垂直组

jPanel1Layout.setVerticalGroup(vGroup);

jPanel1.setLayout(jPanel1Layout);

jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("可爱小猫"));

jPanel2.setLayout(new FlowLayout());

c = new MyCanvas();

jPanel2.add(c);

GroupLayout layout = new GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(GroupLayout.Alignment.LEADING)

.addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addContainerGap()

.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)

.addComponent(jPanel2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jPanel1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

.addContainerGap())

);

layout.setVerticalGroup(

layout.createParallelGroup(GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addComponent(jPanel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jPanel2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addContainerGap())

);

pack();

}

private void jButton_sendActionPerformed(java.awt.event.ActionEvent evt) {

// TODO add your handling code here:

JSONObject result = nlp.process(jTextField1.getText());

jTextField2.setText(nlp.getAnswer(result));

}

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

MyJFrame frame = new MyJFrame();

frame.setTitle("自然语言理解试验小程序——趣味聊天");

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

class MyCanvas extends Canvas {

private static final long serialVersionUID = 1L;

public MyCanvas () {

setBackground (Color.GRAY);

setSize(300, 320);

}

public void paint (Graphics g) {

Graphics2D g2;

g2 = (Graphics2D) g;

update(g2);

}

public void update(Graphics g) {

if (actPhase == 1) {

g

.drawImage(act1, getWidth() / 2

- act1.getWidth(null) / 2, getHeight() / 2

- act1.getHeight(null) / 2, act1

.getWidth(null), act1.getHeight(null), this);

} else {

g

.drawImage(act2, getWidth() / 2

- act2.getWidth(null) / 2, getHeight() / 2

- act2.getHeight(null) / 2, act2

.getWidth(null), act2.getHeight(null), this);

}

}

}

}

2、语义理解NLIProcess:

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.List;

import org.apache.http.HttpEntity;

import org.apache.http.NameValuePair;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSONArray;

import com.alibaba.fastjson.JSONException;

import com.alibaba.fastjson.JSONObject;

public class NLIProcess {

private static final String url = "https://cn.olami.ai/cloudservice/api";

private static final String Appkey = "beaf1c8e85894e1c90b333670d479581";

private static final String Appsecret = "52b158f9c8b741218dcf3931136611b6";

private static final String api = "nli";

public String getAnswer(JSONObject semantic) {

String error = "你刚才说什么,我没有听懂。";

if (semantic == null || !"ok".equalsIgnoreCase(semantic.getString("status")))

return error;

JSONObject data = semantic.getJSONObject("data");

JSONArray s_list = data.getJSONArray("nli");

JSONObject s_first = s_list.getJSONObject(0);

JSONObject desc_obj = s_first.getJSONObject("desc_obj");

int status = desc_obj.getIntValue("status");

if (0 == status) {

return desc_obj.getString("result");

}

return error;

}

public JSONObject process (String input) {

JSONObject NLIresult = new JSONObject();

List params = new ArrayList();

params.add(new BasicNameValuePair("appkey", Appkey));

params.add(new BasicNameValuePair("api", api));

long timestamp = Calendar.getInstance().getTimeInMillis();

params.add(new BasicNameValuePair("timestamp", String.valueOf(timestamp)));

params.add(new BasicNameValuePair("sign", generateSign(timestamp)));

JSONObject request = new JSONObject();

JSONObject data = new JSONObject();

try {

data.put("input_type", 0);

data.put("text", input);

request.put("data_type", "stt");

request.put("data", data);

} catch (JSONException e1) {

e1.printStackTrace();

return NLIresult;

}

params.add(new BasicNameValuePair("rq", request.toString()));

params.add(new BasicNameValuePair("cusid", "asdfghj"));

CloseableHttpClient httpclient = HttpClients.createDefault();

HttpPost httppost = new HttpPost(url);

try {

httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

CloseableHttpResponse response = httpclient.execute(httppost);

try {

HttpEntity entity = response.getEntity();

if (entity != null) {

String contnt = EntityUtils.toString(entity);

NLIresult = JSONObject.parseObject(contnt);

}

} finally {

response.close();

}

} catch (Exception e) {

e.printStackTrace();

return NLIresult;

} finally {

try {

httpclient.close();

} catch (Exception e) {

e.printStackTrace();

}

}

return NLIresult;

}

private String generateSign(long timestamp) {

String sign = Appsecret + "api=" + api + "appkey=" + Appkey + "timestamp=" + timestamp + Appsecret;

return MD5String(sign);

}

public String MD5String(String str) {

try {

MessageDigest msgDigest = MessageDigest.getInstance("MD5");

msgDigest.reset();

msgDigest.update(str.getBytes("UTF-8"));

byte[] byteArrary = msgDigest.digest();

StringBuffer md5StrBuff = new StringBuffer();

for (int i = 0; i < byteArrary.length; i++) {

String tmp = Integer.toHexString(0xFF & byteArrary[i]);

if (tmp.length() == 1) {

md5StrBuff.append(0).append(tmp);

} else {

md5StrBuff.append(tmp);

}

}

return md5StrBuff.toString();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

return null;

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

return null;

}

}

}

欢迎大家下载这个小程序的可运行jar包!趣味聊天demo.jar

关于其他根据olami平台开发的小程序还有:

Olami智能语义解析—学习娱乐小能手

根据OLAMI平台开发的日历Demo

用olami开放语义平台做汇率换算应用

微信小程序+OLAMI自然语言API接口制作智能查询工具–快递、聊天、日历等

用语义开放平台olami开发翻译应用

热门自然语言理解和语音API开发平台对比

使用OLAMI SDK和讯飞语音合成制作一个语音回复的短信小助手

告诉你如何使用OLAMI自然语言理解开放平台API制作自己的智能对话助手

Java中的Canvas绘图源码实例,主要是画线条、弧线、圆角矩形、三角形、文字、圆形等简单的几何图形,主要是通过创建DrawingCanvas对象canvas,为canvas设置命令监听者,实现接口CommandListener的方法,把缓冲区图像的内容绘制到画布上,画图部分代码:   int w = getWidth(); // 画布的宽度   int h = getHeight(); // 画布的高度   Image buffer = Image.createImage(w, h); // 用于绘图的缓冲图像   Graphics gc = buffer.getGraphics(); // 获取缓冲图像的图形环境   // 清除画布   public void clearScreen() {    gc.setColor(255,255,255); // 设置绘图颜色为白色    gc.fillRect(0,0,w,h); // 把缓冲图像填充为白色    gc.setColor(255,0,0); // 设置绘图颜色为红色   }   // 绘制直线   public void drawLine() {    setTitle("直线"); // 设置画布的标题    clearScreen(); // 清除画布    gc.drawLine(10,10,w-20,h-20); // 绘制黑色直线    gc.setColor(0,0,255); // 设置绘图颜色为蓝色    gc.drawLine(10,h/2,w-10,h/2); // 绘制蓝色直线   }   // 绘制弧   public void drawArc() {    setTitle("弧线和填充弧");    clearScreen();    gc.drawArc(5,5,w/2-20,h/2-20,60,216); // 绘制弧线    gc.drawArc(5,h/2-10,w/2-20,h/2-20,0,360); // 绘制圆    gc.setColor(0,0,255);    gc.fillArc(w/2,5,w/2-20,h/2-20,60,216); // 绘制填充弧线    gc.fillArc(w/2,h/2-10,w/2-20,h/2-20,0,360); // 绘制填充圆   }   // 绘制矩形   public void drawRect() {    setTitle("矩形和填充矩形");    clearScreen();    gc.drawRect(25,25,w/2-30,h/2-30); // 绘制矩形    gc.fillRect(w/2 25,25,w/2-30,h/2-30); // 绘制填充矩形   }   // 绘制圆角矩形   public void drawRoundRect() {    setTitle("圆角矩形和填充圆角矩形");    clearScreen();    gc.drawRoundRect(5,5,w-5-30,h/2-30,20,20); // 绘制圆角矩形    gc.setColor(0,0,255);    gc.fillRoundRect(5,h/2,w-30,h/2-30,20,20); // 绘制填充圆角矩形   }   // 绘制三角形   public void drawTriangle() {    setTitle("填充三角形");    clearScreen();    gc.fillTriangle(w/2, h/6, w/6, h/2, w/2, h/2);   }   // 绘制文字   public void drawText() {    setTitle("文字"); //设置标题    clearScreen();    gc.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_SMALL)); // 设置字体    gc.drawString("Hello World!",0,0,gc.TOP|gc.LEFT); // 使用当前字体绘制文字    gc.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD|Font.STYLE_UNDERLINED,Font.SIZE_LARGE));    gc.drawString("Hello
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值