在DUI平台上,是GUIcf辅助卡盟平台对话还是对话cf辅助卡盟平台GUI?

思必驰DUI开放平台首秀:让AI语音快速赋能智能硬件,助力人工智能生态发展
作者:Ou 来源:
思必驰DUI开放平台,技术领先的一站式智能对话定制平台'...
&酷锋网讯,&日,思必驰与CCF-GAIR大会同期,在深圳举行了“AI is DUI,思必驰开发者实战营”的workshop,这是思必驰DUI开放平台的首秀,聚集了来自阿里巴巴、百度、360、富士康、板牙、中科院、深圳大学等知名企业和学界的百余位资深人士及优秀开发者,思必驰CEO高始兴、VP雷雄国、VP赵恒艺等出席现场,带来思必驰DUI开放平台的首次亮相。思必驰DUI开放平台首秀现场人工智能的爆发使各类智能硬件产品层出不穷,AI技术的应用推动着人机交互的变革,智能语音使操控变得更简单,逐渐淘汰了按键、遥控器、APP等终端,成为智能硬件的标配交互方式。但AI语音技术的研发与应用具备技术门槛,风靡全球的亚马逊Alexa在中国市场则水土不服,导致更多的产品企业只能望而却步,因而,为更多的厂商/个人开发者们提供可高度自定义的开放平台,成为刚需。就AI开放平台而言,目前国内虽有很多企业打着“中国版Alexa”的噱头,但整体市场良莠不齐,仍处于初期发展阶段,这为国内做平台的AI企业们提供了巨大的发展机遇。&据思必驰CMO龙梦竹介绍,2014年思必驰发布国内第一个口语对话系统平台&思必驰对话工场&即迈出了平台第一步,为追求体验升级,打造高可用定制的对话平台,思必驰自2016年初开始策划DUI开放平台并结合业务进行了模块化尝试,2016年底,升级成为公司重大战略方向之一。对比亚马逊Alexa的使用需要配置AWS及信用卡,适合具备一定技术能力的专业程序员,思必驰DUI开放平台的操作门槛极低,注册即用,非专业的开发者也能迅速上手使用,DUI平台集合了思必驰多年的语音技术积累,在中文领域的表现尤为优秀。思必驰VP赵恒艺思必驰DUI平台由思必驰VP赵恒艺带队、集合近百人的铁军队伍打造,在Workshop现场,他坦言“平台的诞生源于痛点,思必驰AIOS对话操作系统拥有十分广泛的客户群体,AIOS已被应用到了形形色色的智能硬件产品中,思必驰在与硬件厂商打磨产品的过程中发现,很多厂商受限于自定义产品功能、系统迭代、内容升级等方面的开发,思必驰DUI开放平台将直击这一痛点,缩短厂商开发过程,更好地将智能语音赋能给开发者和企业”。&思必驰团队详细阐述并演示了DUI开放平台,并现场征集了二十位开发者进行实操演练,在短短30分钟内,迅速完成了对话技能定制和体验。在整个过程中,DUI开放平台凸显了以下五大优势:&开发者们进行实操演练一、一站式对话系统定制平台思必驰是目前国内领先的人工智能语音技术企业,坚持产学研一体化道路,拥有数十年的语音技术积淀,思必驰将通过DUI开放平台把核心技术能力开放给开发者们,打造一站式的对话系统定制开发平台,覆盖了语音识别、语音合成、语义理解、智能对话、多轮交互、纠正打断、回声消噪等等,既提供单项技术服务,也提供完整的智能对话交互解决方案。二、高可用定制赵恒艺表示,思必驰DUI开放平台是国内第一个真正意义上的“超高度定制平台”,每个模块均可自定义,例如,GUI自定义,唤醒词定制,技能深度定制;既提供通用的场景对话和内容技能,也支持开发者完整自定义对话逻辑和内容,接入第三方服务,提供细致到每一轮交互的个性化定制,让开发者能够依据产品特性,定制最适合的语音功能。在语音合成方面,思必驰DUI开放十余种个性化合成音,支持快速定制合成等等,以此增强产品的个性化特征。三、云端实时发布更新,本地轻松解决无网问题对于智能语音而言,家居中稳定的网络环境是良好的应用场景,如何应对网络环境不佳甚至是无网环境,成为一大难题,也成为户外场景的刚需功能点。思必驰DUI开放平台 “云+端”解决方案极富竞争力,该平台既提供云端API也提供本地SDK,开发者通过DUI开放平台,可在云端对内容、引擎、对话逻辑、热词等进行实时更新,同时本地的语音唤醒、离线识别、离线技能等则支持在网络不佳甚至是无网络的情况下,保证产品的基本使用。四、数据可视化,多版本管理,运维无压力思必驰DUI开放平台提供可视化大数据平台,开发者可自定义周期、维度、范围查看实时数据,帮助开发者提升产品服务性能、不断优化用户体验。同时,DUI开放平台将极大程度的降低开发者运维压力,支持多版本管理,开设企业账号,根据不同角色设置不同的职责及权限,促进团队协同合作。五、垂直应用场景,丰富技能商店基于思必驰当前的业务发展,目前,思必驰DUI开放平台主要覆盖智能车载、智能家居、智能机器人、故事机、手机助手等场景,后续 DUI平台将逐渐向其他领域延伸,对更多的领域进行场景优化和技能实现。专业而庞大的“技能商店”则能够覆盖不同场景的多样需求,既支持拨打电话、闹铃设置等本地技能,也支持第三方服务资源接入,并进行不断的丰富与完善。现场,赵恒艺表示“思必驰对DUI开放平台投诸较大的关注,除了设立百人团队攻坚之外,思必驰成立2亿元人工智能产业基金,助力思必驰人工智能生态的发展”。思必驰的整个人工智能生态布局已全面展开。思必驰DUI开放平台的首秀为行业带来了惊喜,AI技术推动了物联网、智能硬件等领域的进步,也将赋能传统行业,带来更大的价值与效率。思必驰DUI开放平台极大地提升了智能语音技术的赋能速度和应用效率,平台类产品带来AI技术价值的扩大,或许将是人机交互变革与发展的必经之路。目前思必驰DUI开放平台仍处于内测阶段,并未正式上线,DUI更多的功能和亮点将在后续的workshop活动中陆续曝光。思必驰DUI平台在正式发布之前,将在深圳、北京、上海、杭州、苏州等地展开多场封闭式的开发者workshop,具体信息可关注思必驰DUI平台公众号(ID:aispeechDUI)。&
1.酷锋网遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.酷锋网的原创文章,请转载时务必注明文章作者和"来源:酷锋网",不尊重原创的行为酷锋网或将追究责任;3.作者投稿可能会经酷锋网编辑修改或补充。
关注微信公众号,了解最新精彩内容拒绝访问 | www. | 百度云加速
请打开cookies.
此网站 (www.) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(39998add62f743dd-ua98).
重新安装浏览器,或使用别的浏览器GUI编程引言
以前的学习当中,我们都使用的是命令交互方式:
  例如:在DOS命令行中通过javac java命令启动程序.
软件的交互的方式:
GUI编程引言
以前的学习当中,我们都使用的是命令交互方式:
  例如:在DOS命令行中通过javac java命令启动程序.
软件的交互的方式:
1. 命令交互方式
图书管理系统
  2. 图形交互方式
    ava提供了专业的API用于开发图形用户界面
      GUI--& Graphic
将要了解GUI API的框架结构,以及GUI组件以及组件之间的关系,容器和布局管理器,颜色,字体等.
  Java1.0版本的图形用户界面库,设计目标是帮助程序员编写在所有平台上都能良好表现的GUI程序。为了实现这个目标Java1.0提供了抽象窗口工具集(AWT),但是这个目标并没有达到。AWT在所有的系统上表现都不好。因为:最初版本的AWT是在一个月内构思,设计和实现的(Think in Java )。
  Abstract
抽象窗口工具集
  Java将图形用户界面相关的类捆绑在了一起,放在了一个称之为抽象窗口工具集的库中.AWT适合开发简单的图形用户界面,并不适合开发复杂的GUI项目.
  位于: java.awt.* 中,定义了很多的组件类,开发者可以直接创建对象加以使用
  缺点: 所有的图形界面都依赖于底层的操作系统,容易发生于特定平台相关的故障.
  AWT调用本地系统资源生成图形化界面, 依赖本地平台. 1.0
2.2. Swing
SUN公司对AWT进行了升级,基于AWT,推出了一种更稳定,更通用和更灵活的库.称之为Swing组件库(Swing component)。
既然都是用于GUI设计的组件库,那么为了区分Swing组件类和对应的AWT组件类,Swing组件类都已字母J为前缀.位于:javax.swing.* 中,提供了和AWT中等同的所有的组件类,但是类名的前面多加了一个J.
SWING可以跨平台. 1.2
我们主要学习Swing GUI组件.
Java GUI API
GUI API包含的类分为三个部分:组件类(component class) 容器类(container class),和辅助类(helper class)
组件类是用来创建用户图形界面的,例如JButton,JLabel,JTextField.
容器类是用来包含其他组件的,例如JFrame,JPanel
辅助类是用来支持GUI组件的,例如Color,Font
3.1. 组件类
在图形用户界面程序中当我们想要创建按钮、复选框和滚动条等这些可以显示在屏幕上的对象,该如何创建。其实这些都属于一类叫做组件类。
AWT中的组件根类
类 Component
java.lang.Object
Swing中的组件根类
javax.swing
类 JComponent
java.lang.Object
java.awt.Container
javax.swing.JComponent
组件类的实例可以显示在屏幕上.Component类是包括容器类的所有用户界面类的根类是java.awt中的类,对应的Swing中的是Jcomponent.了解了Component和JComponent都是抽象类.所以不能使用new关键字创建对象.所以需要使用它们的具体的实现类来创建对象.
在AWT中典型图形用户界面中的按钮(Button)、复选框(Checkbox)和滚动条(Scrollbar)都是组件类,都是Component类的子类.
在Swing中的GUI组件,有对应的JButton,JCheckBox,JscrollBar
继承关系图(AWT)
3.2. 容器类
  容器(Container),是一个特殊的组件,该组件可以通过add()添加其他组件。
  容器类适用于盛装其他GUI组件的GUI组件.例如 Panel Frame Dialog都是AWT组件的容器类.
对应的Swing组件的容器类是JPanel JFrame JDialog
3.3. GUI辅助类
用来描述GUI组件的属性,例如图像的颜色,字体等. 注意:辅助类是在java.awt中的
3.4. GUI运行原理
在JDK的bin目录中有javaw.exe .javaw.exe是java在window中专门用于执行GUI程序.
import javax.swing.JF
import javax.swing.JOptionP
public class Demo {
public static void main(String[] args) {
// 创建JFrame
JFrame frame = new JFrame("hello,world");
// 设置尺寸
frame.setSize(200, 100);
// JFrame在屏幕居中
frame.setLocationRelativeTo(null);
// JFrame关闭时的操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 显示JFrame
frame.setVisible(true);
Jframe框架
JFrame(框架)是一个容器
创建一个用户界面需要创建一个JFrame来存放用户界面组件.例如存放按钮,文本框。
javax.swing
java.lang.Object
java.awt.Container
java.awt.Window
java.awt.Frame
javax.swing.JFrame
5.1. 创建一个框架
public class Demo1 {
public static void main(String[] args) {
// 创建JFrame
JFrame frame = new JFrame("我的frame");
// 显示JFrame
frame.setVisible(true);
注意:需要调用setVisible(true)方法后才会显示框架
  运行程序会在窗口的左上角显示一个窗口,但是只能显示标题栏,而且关闭JFrame时,程序程序没有停止.
所以需要完成如下需求:
  1: 设置Jframe的宽度和高度
  2: 让Jframe显示在屏幕中间
  3: 关闭Jframe时,程序会停止
设置JFrame的宽度和高度
java.awt.Window.setSize(int width, int height)
查找API文档,查看 setSize方法,可以指定框架的宽度和高度.参数类型是int,注意是以像素为单位,普通的笔记本的屏幕分辨率为或者.注意:分辨率表示每平方英寸的像素数.屏幕分辨率越高,屏幕的像素越多.所以分辨率越高看到的细节就越多.
setSize方法被定义在ponent类中,被Component
的子类java.awt.Window 重写.而Jframe以继承了Windiws类所以也具备该方法.
JFrame显示在屏幕中间
setLocationRelativeTo()方法
java.awt.Window.setLocationRelativeTo(Component c)
设置窗口相对于指定组件的位置。
如果 c 为 null,则此窗口将置于屏幕的中央。
setLocationRelativeTo(null)方法可以在屏幕上居中显示框架.
如果不想要设置在中间,可以使用
setLocation(200, 100);
关闭JFrame程序停止
setDefaultCloseOperation(int operation)方法
javax.swing.JFrame.setDefaultCloseOperation(int operation)
该方法告诉程序,当框架关闭时结束程序.方法的参数是JFrame 的常量EXIT_ON_CLOSE
public class Demo1 {
public static void main(String[] args) {
// 创建JFrame
JFrame frame = new JFrame("我的frame");
// 设置尺寸
frame.setSize(200, 100);
// JFrame在屏幕居中
frame.setLocationRelativeTo(null);
// JFrame关闭时的操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 显示JFrame
frame.setVisible(true);
5.2. 框架中添加组件
上述案例中的框架是空的.可以通过add方法在框架中添加组件
java.awt.Container.add(Component comp)
public static void main(String[] args) {
// 创建JFrame
JFrame frame = new JFrame("我的frame");
// 创建按钮
JButton button = new JButton("OK");
// 向frame中添加一个按钮
frame.add(button);
// 设置尺寸
frame.setSize(200, 100);
// JFrame在屏幕居中
frame.setLocationRelativeTo(null);
// JFrame关闭时的操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 显示JFrame
frame.setVisible(true);
运行程序,会显示上图所示窗口.调整窗口的大小,按钮都是显示在窗口的中央,并且占满整个框架.
这是因为组件(本例就是按钮)是被布局管理器放到框架中的.默认布局管理器就是将按钮放到中央.
备注: 可以通过f.setVisible(false);
隐藏窗体f.dispose();关闭窗口
setIconImage(Toolkit.getDefaultToolkit().createImage("png-0015.png"));
JoptionPane对话框
显示一个带有OK 按钮的模态对话框。
下面是几个使用showMessageDialog 的例子:
JOptionPane.showMessageDialog(null, "错误信息提示", "标题", RMATION_MESSAGE);
效果如下:
JOptionPane.showMessageDialog(jPanel, "提示消息", "标题",JOptionPane.WARNING_MESSAGE);
JOptionPane.showMessageDialog(null, "提示消息.", "标题",JOptionPane.ERROR_MESSAGE);
JOptionPane.showMessageDialog(null, "提示消息.", "标题",JOptionPane.PLAIN_MESSAGE);
1.2 showOptionDialog
这个函数可以改变显示在按钮上的文字。你还可以执行更多的个性化操作。
常规的消息框:
int n = JOptionPane.showConfirmDialog(null, "你高兴吗?", "标题",JOptionPane.YES_NO_OPTION);//i=0/1
String inputValue = JOptionPane.showInputDialog("请输入你给我金额");
面板(Panel)
面板也是一个容器的组件,可以在上面添加
注意:面板不能单独使用,必须在顶层窗口中使用。
一些常用的组件例如:
JTextField
JPassworldField
JRadioButton
8.1. Button按钮
Java中的Swing提供了常规按钮,单选按钮,复选按钮和菜单按钮
JButtion普通按钮
按钮Button是点击时触发动作事件的组件.
JRadioButton单选按钮
单选按钮,可以让用户从一组选项中选择一个单一条目.例如性别.
使用单选按钮时注意将,单选按钮放在一组,需要使用java.swing.ButtonGroup. 的add方法,添加到一个组中,位于同一个组的单选按钮就是互斥的. 如果没有将单选按钮放在一个组中,就是独立的..我们让然需要把按钮添加在容器中.因为ButtonGroup添加到容器中..
JCheckBox复选框
8.2. JLabel标签
8.3. JTextField文本域
8.4. JTextArea文本区域
8.5. JComboBox组合框
8.6. JList 列表框
例如: String[] data = { "one", "two", "three" };
JList list = new JList(data);
p1.add(list);
8.7. JmenuBar菜单条
JMenultem菜单项
菜单条(MenuBar)中包含菜单(Menu),菜单中中包含菜单项(MenuItem)
注意添加的顺序。例如:记事本的菜单条中包含文件、编辑、格式、查看、帮助菜单。其中文件菜单中包含新建、打开、保存、另存为等菜单项
案例综合。
public class CommonComponent extends JFrame {
public CommonComponent() {
JPanel p1 = new JPanel();
JLabel name = new JLabel("用户名:");
p1.add(name);
JTextField field = new JTextField(8);
p1.add(field);
JLabel passwd = new JLabel("密码");
p1.add(passwd);
JPasswordField pass = new JPasswordField(8);
p1.add(pass);
// 单选按钮
JLabel gender = new JLabel("性别");
p1.add(gender);
JRadioButton male = new JRadioButton("男");
JRadioButton female = new JRadioButton("女");
// 单选按钮组,同一个单选按钮组的互斥.
ButtonGroup group = new ButtonGroup();
group.add(male);
group.add(female);
// 注意,单选按钮组不能添加进容器
p1.add(male);
p1.add(female);
JLabel like = new JLabel("爱好:");
p1.add(like);
JCheckBox eat = new JCheckBox("吃饭");
JCheckBox movie = new JCheckBox("看电影");
JCheckBox sleep = new JCheckBox("睡觉");
p1.add(eat);
p1.add(movie);
p1.add(sleep);
JLabel info = new JLabel("个人简介");
p1.add(info);
JTextArea area = new JTextArea(20, 20);
p1.add(area);
String[] data = { "one", "two", "three" };
JList list = new JList(data);
p1.add(list);
// 普通按钮
JButton button = new JButton("注册");
p1.add(button);
JMenuBar bar = new JMenuBar();
JMenu menu = new JMenu("文件");
// 菜单选项
JMenuItem myNew = new JMenuItem("新建");
JMenuItem myOpen = new JMenuItem("打开");
bar.add(menu);
menu.add(myNew);
menu.add(myOpen);
add(bar, BorderLayout.NORTH);
public static void main(String[] args) {
CommonComponent frame = new CommonComponent();
frame.setTitle("常用组件");
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
因为面板默认是流式布局.
布局管理器
Java的GUI组件都放置在容器中,他们的位置是由容器的布局管理器来管理的.在前面的程序中,并没有指定将OK按钮放置在框架的什么位置,但是,Java知道应该把它放置在哪里,因为在后台工作的布局管理器能够将组件放到正确的位置.布局管理器是使用布局管理器类创建的.
我们可以使用setLayout() 方法在容器中设置布局管理器.
我们将要了解FlowLayout GridLayout BorderLayout
9.1. FlowLayout流式布局
FlowLayout(流式布局)是最简单布局管理器. Jpanel容器默认的布局管理器
流式布局,按照组件添加的顺序,从左到到右将组件排列在容器中.当放满一行,就开始新的一行.在FlowLayout有3个常量FlowLayout可以指定组件的对齐方式.
每一行组件都应该是左对齐的
每一行组件都应该是右对齐的
每一行组件都应该是居中的
还可以指定组件之间的以像素为单位的间隔.
int getHgap()
获取组件之间以及组件与 Container 的边之间的水平间隙。
int getVgap()
获取组件之间以及组件与 Container 的边之间的垂直间隙。
void setHgap(int hgap)
设置组件之间以及组件与 Container 的边之间的水平间隙。
void setVgap(int vgap)
设置组件之间以及组件与 Container 的边之间的垂直间隙。
这个布局管理器的对其方式默认值是CENTER
这个布局管理器的水平间隔默认值是 5个像素
这个布局管理器的垂直间隔默认是是5个像素
创建该布局管理器
FlowLayout()
构造一个新的 FlowLayout,它是居中对齐的,默认的水平和垂直间隙是 5 个单位。
FlowLayout(int align)
构造一个新的 FlowLayout,它具有指定的对齐方式,默认的水平和垂直间隙是 5 个单位。
FlowLayout(int align, int hgap, int vgap)
创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。
案例:创建框架,使用流失布局管理器.向该框架添加三个标签和文本域.
public class ShowFlowLayout extends JFrame {
public ShowFlowLayout() {
super.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 20));
add(new JLabel("姓名:"));
add(new JTextField(8));
add(new JLabel("邮箱:"));
add(new JTextField(8));
add(new JLabel("电话:"));
add(new JTextField(8));
public static void main(String[] args) {
ShowFlowLayout frame = new ShowFlowLayout();
frame.setTitle("FlowLayout");
frame.setSize(500, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
该案例在本类main方法中创建了一个本类对象. 该类的构造函数中创建并且添加组件.
该案例使用了FlowLayout管理器在框架放置组件.如果改变框架的大小.组建会自动的重新排列,以适应框架.
如果将同一个按钮在框架中添加10次,那么该框架只会出现一次,将一个按钮向容器中添加多以和一次是一样的.
9.2. GridLayout网格布局
GridLyaout是以网格形式管理组件的.组件按照他们添加的顺序从左到右排列,显示第一行,接着是第二行,一次类推.
Gridlayout可以指定网格中的行数和列数
行数和列数可以是0但是不能两者都为0.
如果一个为0另外一个不为0,那么不为0的行或列的大小就是固定的,为0的行或者列有布局管理器动态决定.
例如:如果指定一个网格有0行3列10个组件,GirdLayout会创建3个固定的列和行,最后一行只有一个组件.如果指定一个网格有3行0列10个组件,GridLayout就会创建3行4列,最后一行包含2个组件.
如果行数和列数都不为0,那么以行数为依据.所以行数是固定的,布局管理器会动态的计算列数.例如,如果指定一个网格有3行3列10个组件,GridLayout会创建3个固定的行和4列,最后一行包含2个组件.
GridLayout()
创建具有默认值的网格布局,即每个组件占据一行一列。
GridLayout(int rows, int cols)
创建具有指定行数和列数的网格布局。
GridLayout(int rows, int cols, int hgap, int vgap)
创建具有指定行数和列数,水平间隔,垂直间隔的网格布局。
int getRows()
获取此布局中的行数。 默认值是1
int getColumns()
获取此布局中的列数。 默认值是1
int getHgap()
获取组件之间的水平间距。 默认值是0
int getVgap()
获取组件之间的垂直间距。默认值是0
void setRows(int rows)
将此布局中的行数设置为指定值。默认值是1
void setColumns(int cols)
将此布局中的列数设置为指定值。
void setHgap(int hgap)
将组件之间的水平间距设置为指定值。
void setVgap(int vgap)
将组件之间的垂直间距设置为指定值。默认值是0
案例:该案例依然添加3个标签和3个文本域,只不过布局管理器是GrigLayout
public class ShowGridLayout extends JFrame {
public ShowGridLayout() {
setLayout(new GridLayout(3, 2, 5, 5));
add(new JLabel("姓名:"));
add(new JTextField(8));
add(new JLabel("邮箱:"));
add(new JTextField(8));
add(new JLabel("电话:"));
add(new JTextField(8));
public static void main(String[] args) {
ShowGridLayout frame = new ShowGridLayout();
frame.setTitle("GridLayout");
frame.setSize(200, 125);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
如果使用setLayout(new GridLayout(3,10))替换setlayout语句,还是会得到3行2列,因为行的参数非零,所以列的参数会被忽略.列的实际参数是由布局管理器计算出来的.
9.3.BorderLayout边框布局
边框布局,JFrame 容器默认的布局管理器是边框布局.该管理器将容器非为东西南北中5个区域.
我们使用add(Component,index)方法可以将组件添加进到BorderLayout中,index是一个常量,有5个值
东区域的布局约束(容器右边)。
西区域的布局约束(容器左边)。
南区域的布局约束(容器底部)。
北区域的布局约束(容器顶部)。
中间区域的布局约束(容器中央)。
BorderLayout()
构造一个组件之间没有间距的新边框布局。
BorderLayout(int hgap, int vgap)
构造一个具有指定组件间距的边框布局。
int getHgap()
返回组件之间的水平间距。
int getVgap()
返回组件之间的垂直间距。
void setHgap(int hgap)
设置组件之间的水平间距。 默认值是0
void setVgap(int vgap)
设置组件之间的垂直间距。默认值是0
组件会根据他们最合适的尺寸和在容器中的位置来放置,南北组件可以水平拉伸,东西组件可以垂直拉伸,中央组件既可以水平拉伸也可以垂直拉伸.
案例:演示边框布局管理器
public class ShowBorderLayout extends JFrame {
public ShowBorderLayout() {
setLayout(new BorderLayout(5, 10));
add(new JButton("东"), BorderLayout.WEST);
add(new JButton("西"), BorderLayout.EAST);
add(new JButton("南"), BorderLayout.SOUTH);
add(new JButton("北"), BorderLayout.NORTH);
add(new JButton("中"), BorderLayout.CENTER);
public static void main(String[] args) {
ShowBorderLayout frame = new ShowBorderLayout();
frame.setTitle("BorderLayout");
frame.setSize(300, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
注意: 如果布局管理器为Border管理器,调用add方法,没有说明组件的位置(东西南北中)默认是center.
add(new JButton("ok"))和add(new JButton("ok"), BorderLayout.CENTER )
效果是一样的.
如果在Border容器中添加2个组件,都没有指定位置,那么只会显示最后一个组件
add(new JButton("ok1"))和add(new JButton("ok2")) 只会显示ok2
使用布局管理器
public class CommonComponent extends JFrame {
public CommonComponent() {
JMenuBar bar = new JMenuBar();
JMenu menu = new JMenu("文件");
// 菜单选项
JMenuItem myNew = new JMenuItem("新建");
JMenuItem myOpen = new JMenuItem("打开");
bar.add(menu);
menu.add(myNew);
menu.add(myOpen);
add(bar, BorderLayout.NORTH);
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(2, 2, 5, 5));
JLabel name = new JLabel("用户名:");
p1.add(name);
JTextField field = new JTextField(8);
p1.add(field);
JLabel passwd = new JLabel("密码");
p1.add(passwd);
JPasswordField pass = new JPasswordField(8);
p1.add(pass);
JPanel p2 = new JPanel();
// 单选按钮
JLabel gender = new JLabel("性别");
p2.add(gender);
JRadioButton male = new JRadioButton("男");
JRadioButton female = new JRadioButton("女");
// 单选按钮组,同一个单选按钮组的互斥.
ButtonGroup group = new ButtonGroup();
group.add(male);
group.add(female);
// 注意,单选按钮组不能添加进容器
p2.add(male);
p2.add(female);
JPanel p3 = new JPanel();
JLabel like = new JLabel("爱好:");
p3.add(like);
JCheckBox eat = new JCheckBox("吃饭");
JCheckBox movie = new JCheckBox("看电影");
JCheckBox sleep = new JCheckBox("睡觉");
p3.add(eat);
p3.add(movie);
p3.add(sleep);
JPanel p4 = new JPanel(new GridLayout(1, 0, 5, 5));
JLabel info = new JLabel("个人简介:");
p4.add(info);
JTextArea area = new JTextArea(50, 10);
p4.add(area);
JPanel p5 = new JPanel(new BorderLayout());
String[] data = { "one", "two", "three" };
JList list = new JList(data);
p5.add(list, BorderLayout.WEST);
JPanel p6 = new JPanel();
// 普通按钮
JButton button = new JButton("注册");
p6.add(button);
JButton button2 = new JButton("取消");
p6.add(button2);
setLayout(new GridLayout(7, 1, 5, 5));
public static void main(String[] args) {
CommonComponent frame = new CommonComponent();
frame.setTitle("常用组件");
frame.setSize(400, 600);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// frame.pack();
frame.setVisible(true);
public class TestPanel extends JFrame {
public TestPanel() {
// 创建面板,默认是流式布局
JPanel p1 = new JPanel();
// 指定为网格布局,4行3列
p1.setLayout(new GridLayout(4, 3));
for (int i = 1; i &=9; i++) {
p1.add(new JButton("" + i));
p1.add(new JButton("0"));
p1.add(new JButton("OK"));
p1.add(new JButton("EXIT"));
// 创建面板,指定边框布局
JPanel p2 = new JPanel(new BorderLayout());
// 面板添加文本域,边框北部
p2.add(new JTextField("我在这里啊!!!"), BorderLayout.NORTH);
// 面板添加其他面板,边框中部.
p2.add(p1, BorderLayout.CENTER);
// 框架添加面板,框架的布局默认就是边框布局,面板指定位于框架西部
add(p2, BorderLayout.EAST);
// 框架添加按钮,位于框架总部.
add(new JButton("哈哈"), BorderLayout.CENTER);
public static void main(String[] args) {
TestPanel frame = new TestPanel();
frame.setTitle("JPanel");
frame.setSize(400, 260);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
注意: 面板容器是一个轻量级的容器,该容器不能单独的使用,必须依赖与外层的顶层容器(JFrame)
Java事件监听机制
在上述的程序中,其中菜单条,菜单 项,按钮等都是对象,当我们单击对象时,应该能够完成一些任务.例如在程序中通过鼠标操作时,单击,双击,鼠标移入,鼠标移出.能够执行一些任务,在 Java中我们可以使用事件监听机制,在Java的事件监听机制中 ,当事件发生时(点击按钮,移动鼠标等,关闭窗口)会被一类对象发现并处理.
10.1. 事件和事件源
在运行java图形用户界面程序时,用户与程序交互,用户执行了某些操作时,会发生一些事情, 那么事件(event)可以定义为程序发生了某些事情的信号.典型用户操作就是用户移动鼠标,点击按钮,敲击键盘等.程序可以选择相应事件或者忽略事件。
能够创建一个事件并触发该事件的组件称为源对象。例如由于按钮能够点击, 那么按钮就是一个源对象,按钮被点击就是一个事件。
一个事件是事件类的实例对象。事件类的根类是java.util.EventObject。
事件对象包含事件相关的属性,可以使用EventObject类中的实例方法getSource获得事件的源对象。
EventObject类的子类可以描述特定类型的事件
触发的事件类型
ActionEvent
文本域按回车
JTextField
ActionEvent
窗口打开,关闭,最小化,关闭
WindowEvent
单击,双击,移动,鼠标
MouseEvent
点击单选框
JradioButton
ItemEvent ActionEvent
点击复选框
ItemEvent ActionEvent
10.2. 监听器
当源对象触发了一个事件,谁来处理这个事件?在Java中对此感兴趣的对象会处理它。对此感兴趣的对象称之为监听器(Listener)。
举例来说当我们点击一个按钮,想要按钮执行一些动作,需要一个对象来监控按钮,当点击按钮的事件发生时,该对象就会监听到按钮事件。进而可以执行一些动作。
Java中,对象表示的每个事件都是由java.util中EventObject类的子类,
例如: MouseEvent: 表示鼠标的动作,例如移动光标,单击,双击
KeyEvent: 表示键盘上的按键.
ActionEvent表示用户采取的用户界面操作,例如点击屏幕上的按钮.
10.3. 事件处理
Java对组件都有对应的事件监听器,和添加事件监听器方法。
例如: 按钮: 源对象,会触发
体验:当用户点击按钮时,按钮上的信息会发生变化
import java.awt.event.ActionE
import java.awt.event.ActionL
import javax.swing.JB
import javax.swing.JF
public class ShowButton extends JFrame {
public ShowButton() {
JButton button = new JButton("点我");
add(button);
// 添加鼠标监听事件
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击");
Object source = e.getSource();
JButton button = (JButton)
String text = button.getText();
if ("按钮被点击".equals(text)) {
button.setText("点我");
button.setText("按钮被点击");
public static void main(String[] args) {
ShowButton frame = new ShowButton();
frame.setTitle("我的框架");
frame.setSize(400, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
10.4. 窗口事件
java.lang.Object
java.awt.Container
java.awt.Window
Window 对象是一个顶层窗口。窗口(Window)对应的事件叫做窗口事件(WindowEvent),任何窗口(Window)以及窗口的子类都可能触发窗口事件: 打开窗口,正在关闭窗口,激活窗口,变成非活动窗口,最小化窗口和还原窗口。
Window添加窗口事件(WindowEvent)监听器的方法
void addWindowListener(WindowListener l)
添加指定的窗口侦听器,以从此窗口接收窗口事件
监听Window窗口事件(WindowEvent)的监听器:WindowListener
java.awt.event
接口 WindowListener
用于接收窗口事件的侦听器接口。当通过打开、关闭、激活或停用、图标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法
WindowListener接口中定义的方法
抽象方法:
void windowActivated(WindowEvent e)
void windowClosed(WindowEvent e)
void windowClosing(WindowEvent e)
正在关闭窗口
void windowDeactivated(WindowEvent e)
变为非活动窗口
void windowDeiconified(WindowEvent e)
void windowIconified(WindowEvent e)
最小化窗口
void windowOpened(WindowEvent e)
案例: 框架的事件监听处理
javax.swing
java.lang.Object
java.awt.Container
java.awt.Window
java.awt.Frame
javax.swing.JFrame
创建JFrame,Jfame是一个框架,属于窗体(Window)体系中的一员,也可以实现窗口的最大化,最小化,关闭,点击窗体,等一系列的操作。那么在用户触发这些事件发生时能够做一些工作,就需要注册事件监听器。
JFrame 是通过addWindowListener 方法就注册窗体事件监听器,该方法需要接受一个监听器(WindowListener)对象。查找API文档,发现WindowListener是一个接口,
我们需要窗口监听器(WindowListener)的实例对象,所以需要实现该接口,重写WindowListener接口的抽象方法。然后创建该实现类对象,作为参数传递给addWindowListener .
例如: 当像激活窗口这样的窗口事件发生时,windowActivated 方法就会触发。
代码如下:
import java.awt.event.WindowE
import java.awt.event.WindowL
import javax.swing.JF
public class WindowEventDemo extends JFrame {
WindowEventDemo() {
// this对象时JFrame的子类,而JFrame 类是Window体系中的一员所以具备添加窗口事件的方法
this.addWindowListener(new MyWindow());
public static void main(String[] args) {
WindowEventDemo frame = new WindowEventDemo();
frame.setTitle("我的框架");
frame.setSize(400, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
// 实现WindowListener
class MyWindow implements WindowListener {
// 激活窗口
public void windowActivated(WindowEvent e) {
System.out.println("激活窗口");
// 关闭窗口
public void windowClosed(WindowEvent e) {
System.out.println("关闭窗口");
// 正在关闭窗口
public void windowClosing(WindowEvent e) {
System.out.println("正在关闭窗口");
// 变为非活动窗口
public void windowDeactivated(WindowEvent e) {
System.out.println("变为非活动窗口");
// 还原窗口
public void windowDeiconified(WindowEvent e) {
System.out.println("还原窗口");
// 最小化窗口
public void windowIconified(WindowEvent e) {
System.out.println(" 最小化窗口");
// 打开窗口
public void windowOpened(WindowEvent e) {
System.out.println("打开窗口");
总结:Window类或者Window类的任何子类都可能会触发WindowEvent。因为JFrame是Window的子类。所以也可以触发WindowEvent。
1.5. 监听器接口适配器
因为WindowListener接口中的方法都是抽象的,所以即使程序中不想关注某些事件,但是还是要实现所以的方法,比较麻烦,为了方便起见,Java提供了一个针对WindowListener接口的实现类,该类中把WindowListener接口中的方法全部实现,只不过方法体都为空。
例如: 加入我们只对激活窗口感兴趣,那么只需要继承该实现类重写激活窗口的方法即可。简化了代码。
import java.awt.event.WindowA
import java.awt.event.WindowE
import javax.swing.JF
public class AdapterDemo extends JFrame {
AdapterDemo() {
addWindowListener(new MyAdapter());
public static void main(String[] args) {
AdapterDemo frame = new AdapterDemo();
frame.setTitle("我的框架");
frame.setSize(400, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
class MyAdapter extends WindowAdapter {
public void windowActivated(WindowEvent e) {
System.out.println("windowActivated....");
那么这个WindowAdapter类就叫做适配器类,是为了简化代码的书写而出现的。
WindowAdapter
WindowListener
MouserAdapter
MouserListener
KeyAdapter
KeyListener
10.6. 鼠标键盘事件
当在一个组件上按下,释放,点击,移动,或者拖动鼠标时,就会产生鼠标事件。MouseEvent对象捕获这个事件。
MouseEvent
java.awt.event.MouseEvent
Java对鼠标事件提供了MouseListener 监听器接口,可以监听鼠标的按下,释放,输入,退出和点击动作。
MouseListener
用于接收组件上“感兴趣”的鼠标事件(按下、释放、单击、进入或离开)的侦听器接口
void mouseClicked(MouseEvent e)
鼠标按键在组件上单击(按下并释放)时调用。
void mouseEntered(MouseEvent e)
鼠标进入到组件上时调用。
void mouseExited(MouseEvent e)
鼠标离开组件时调用。
void mousePressed(MouseEvent e)
鼠标按键在组件上按下时调用。
void mouseReleased(MouseEvent e)
鼠标按钮在组件上释放时调用。
按键事件可以利用键盘来控制和执行一些动作,如果按下、释放一个键就会触发按键事件。KeyEvent对象可以捕获按键的按下放开和敲击。KeyEvent提供了getkeyChar 来获取按键对应的字符。
java.awt.event.KeyEvent
char getKeyChar()
返回与此事件中的键关联的字符。
Java提供了KeyListener监听器接口来监听按键事件。
KeyListener接口
用于接收键盘事件(击键)的侦听器接口。
void keyPressed(KeyEvent e)
按下某个键时调用此方法。
void keyReleased(KeyEvent e)
释放某个键时调用此方法。
void keyTyped(KeyEvent e)
键入某个键时调用此方法。
public class MouseEventDemo extends JFrame {
MouseEventDemo() {
JButton button = new JButton("ok");
JTextArea text = new JTextArea();
add(button, BorderLayout.NORTH);
add(text, BorderLayout.CENTER);
button.addMouseListener(new MouseListener() {
// 鼠标按钮在组件上释放时调用。
public void mouseReleased(MouseEvent e) {
System.out.println("鼠标释放");
// 鼠标按键在组件上按下时调用。
public void mousePressed(MouseEvent e) {
System.out.println("鼠标按下组件");
// 鼠标离开组件时调用。
public void mouseExited(MouseEvent e) {
System.out.println("鼠标离开组件");
// 鼠标进入到组件上时调用。
public void mouseEntered(MouseEvent e) {
// 鼠标进入
System.out.println("鼠标进入组件");
// 鼠标按键在组件上单击(按下并释放)时调用。
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标单击组件");
text.addKeyListener(new KeyListener() {
// 键入某个键时调用此方法。
public void keyTyped(KeyEvent e) {
System.out.println("键入某个键");
if (e.getKeyChar() == 'q') {
System.exit(0);
// 释放某个键时调用此方法。
public void keyReleased(KeyEvent e) {
System.out.println("按键释放");
// 按下某个键时调用此方法。
public void keyPressed(KeyEvent e) {
System.out.println("键盘按下");
public static void main(String[] args) {
MouseEventDemo frame = new MouseEventDemo();
frame.setTitle("鼠标事件");
frame.setSize(400, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
10.7. 事件监听机制小结
一:确定事件源(容器或组件)
二:注册监听器
   通过事件源对象的addXXXListener()方法将监听器对象注册到该事件源上。
三:监听器对象
   注册监听器时,需要指定监听器对象。
以参数的形式进监听器对象传递给addXXXListener()
监听器对象是XXXListener的子类对象或者XXXAdapter的子类对象。
  监听器对象一般用匿名内部类来表示。(简化书写)
  在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。
   事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者getComponent()获取。)
四:常见的事件监听器
WindowListener
主要用于监听窗口
ActionListener
主要用于用监听组件对象的单击动作
MouseListener
鼠标监听器
KeyListener
五:常见的事件适配器
WindowAdapter
MouseAdapter
KeyAdapter
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】浅析混合云和跨地域网络构建实践,分享高性能负载均衡设计,9月21日阿里云专家和你说说网络那些事儿,足不出户看直播,赶紧预约吧!&&
在云上签发Symantec、WoSign、CFCA证书,实现网站HTTPS化,使网站可信,防劫持、防篡改、防监听...
基于全网公开发布数据、传播路径和受众群体画像,利用语义分析、情感算法和机器学习,分析公众对品牌形象、热点事件和公...
是众安保险针对阿里云用户推出的信息安全综合保险,若因黑客攻击导致用户云服务器上的数据泄露并造成经济损失,众安保险...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017杭州云栖大会火热抢票
Loading...}

我要回帖

更多关于 cf辅助卡盟平台 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信