第一篇:Java 教案-第12章 GUI初步
第12章 GUI初步
12.1 介绍(Introduction)
为JavaGUI程序设计应用程序接口(API)是面向对象编程最精彩的内容,图形用户界面(GUI)可以通过键盘或鼠标来响应用户的操作。这章首先介绍GUI编程基础,然后用GUI来讲述面向对象编程,特别是要讲框架和组件的关系,包括容器,布局管理器,颜色,字体,边框和图标等。12.2 Swing和AWT 前面第8章,稍微介绍了一些面向对象编程的GUI例子,显示GUI组件,使用了诸如Jbutton,Jlabel等GUI组件。为什么这些GUI前会有一个J?为什么不用Button?事实上,在java.awt包中已经有一个名为Button的类。
当Java问世的时候,称AWT(Abstract Windows Toolkit)的GUI类就被绑定在类库中。对于开发简单的图形用户界面,AWT是胜任的,但如果开发综合,复杂的GUI工程却力不从心。另外,AWT是依赖于平台的,即AWT组件的样式与它使用的底层平台相似。新版本中,许多AWT的用户界面组件被一个更鲁棒,灵活,通用的Swing组件代替。Swing组件使用Java代码编写,被直接应用在程序上,而不是调用底层的平台服务。但java.awt.Window或java.awt.Panel的子类除外,因为他们必须使用特定平台本地的GUI来绘制。Swing组件很少依赖目标平台,很少使用平台下的本地GUI程序,鉴于此,把它称为轻量级组件,而AWT称为重量级组件。
为了和AWT组件进行区分,Swing组件的类命名加前缀J,尽管AWT组件依然被现在版本的Java支持,但最好使用轻量级组件,因为AWT最终会淡出历史舞台,也因此,只介绍Swing组件。12.3 Java GUI与 API GUI的API包含的类可以被分为3类,组件类,容器类,帮助类。它们的层次关系如图所示。
组件类,如Jbutton等用来创建用户界面。容器类,如Jframe,Jpanel和Japplet等用来盛载其他组件。帮助类,如Graphics,Color等用来支持GUI组件。
注意:Jframe,Japplet,Jdialog和Jcomponent类和它们的子类被组织在Javax.swing包中,其他的类被组织在AWT包中。12.3.1 Component类
Component的实例可以被显示在屏幕上。Component是所有用户界面类的根类(父类),包含Container类。Jcomponent类是所有轻量级组件的根类。Componet和Jcomponent都是抽象类(14章讲解)。现在只需要知道抽象类和类相似,仅仅是不能创建实例就可以了。例如,不可以使用new JComponent()来创建一个Jcomponent对象,但可以使用它非抽象子类的构造方法来创建Jcomponent实例。熟练掌握继承的层次关系非常重要,如下述语句都显示true。
12.3.2 Container类
Container类的实例可以盛载Component的实例,是GUI组件,它用来盛载其他GUI组件的。Window,Panel,Applet,Frame和Dialog都是AWT组件的容器类。为了配合Swing组件,使用Container,Jframe,Jdialog,Japplet和Jpanel类容易,如下图所述。
12.3.3 帮助类
如Graphics,Color,Font,FontMetrics,Dimension和LayoutManager等类是帮助类,它们不是Component的子类。它们用来描述GUI组件的特性,属性,如下图所示。
注意:帮助类在AWT包中,Swing组件不能替换所有的AWT,它替换的只有AWT的GUI组件类,因此AWT帮助类仍然在GUI编程中用处很大。12.4 Frames框架
为了创建用户界面,需要创建一个frame或一个applet(18章介绍)容器来放置用户界面组件。12.4.1 创建Frame 使用Jframe类来创建一个框架frame,如下所示。
使用Jframe创建一个frame窗口,如下程序。
框架frame的可见性默认为false,因此必须使用frame.setVisible(true)来显示框架。语句frame.setSize(400,300),设置框架窗口宽400,高300像素,如果不设置大小,则只显示一个标题栏,运行程序后在屏幕显示如下。
Line 7使得frame在屏幕中间显示,line8告诉程序当frame被关闭时终止,没有此语句,程序将不能终止,这种情况下只能在Dos(windows平台)命令提示符下,使用Ctrl+C来终止,在Eclipse中将使用红色终止按钮来终止程序。
注意:要在调用居中语句前设置窗口大小,否则无效。12.4.2 在Frame中添加组件
使用add方法可以为Frame添加组件,如图所示程序。
每一个JFrame都包含一个content pane(内容面板),内容面板是Container的一个实例。如按钮等GUI组件会被放置在frame的content pane中。在Java早期版本,必须使用getContentPane方法来返回frame的content pane,然后调用content pane的add方法为其添加组件,如下所示(教程中示例如此)。
这是非常笨重的,从java 5以后的新版本允许直接调用frame的add方法来为content pane添加组件,如下:
这个新特性称content-pane授权(给frame),严格的说,是一个组件被添加到frame的content pane。为简单,称把组件添加到frame中。
一个JButton对象使用new Jbutton(“OK”);来创建,使用frame.add(jbtOK)被添加到frame的content pane中。方法add(Compunent comp)定义在Container类中,因为JButton是Component的子类,因此Jbutton的实例同样也是Component的实例,从容器中删除组件使用remove方法,使用方式:Container.remove(jbtOK);当运行程序时,窗口会被显示,按钮会总是出现在窗口中间,不管窗口是否重新设置大小,总是占据整个窗口。原因就是组件被content pane的不仅管理器放置在窗口中,content pane的默认的布局管理器会把这个按钮放置在窗口的中央。下节会学习使用其他几种布局管理器,把组件放置在期望的位置。12.5 布局管理器
介绍3种布局管理器,FlowLayout,GridLayout和BorderLayout。12.5.1 FlowLayout FlowLayout是最简单的布局管理器,称流式布局管理器。组件被从左到右,从上到下的,按它被添加的顺序放置在窗口中。当一行满之后,会另起一行。类中包含三个常量,设置组件的对齐方式,FlowLayout.RIGHT, FlowLayout.CENTER, FlowLayout.LEFT。也可以使用分割线来分割组件,如下所示FlowLayout类图:
下列程序给出一个流式布局,添加三个标签和三个文本框。
为什么使用如上程序来构造一个窗口?原因有三:
1.创建一个GUI应用意味着创建一个窗口框架,很自然会定义成Jframe的子类。2.frame会被扩展出新的组件或方法函数。
3.这个类易于重用,例如可以通过创建多个类的实例来创建多个窗口。
同时这种构造程序的方式易读。从今以后,大多数GUI主类会扩展JFrame类,主类的构造方法会构造用户界面。主方法创建一个主类的实例并显示窗口框架。
这个例子中FlowLayout布局管理器用来放置组件,如果重新调整窗口大小,组件也会自动被重新安排,如上图所示。如果把line10语句用setLayout(new FlowLayout(FlowLayout.RIGHT,0,0))来替换,所有组件会被左对齐,并且中间没有间隔线。
等价语句如下:
假设把一个按钮用add方法加入10次,是否会出现10个相同的按钮?答案是不会,只会出现一个。不要忘记在设置布局中使用new,如setLayout(new FlowLayout()).12.5.2 GridLayout GridLayout也称网格布局(矩阵布局),组件按被添加的先后顺序放置在网格中,放置顺序从左到右,从上到下,如下是网格布局类的UML类图。
可以设定网格的行和列数,基本原则如下:
1.行数或列数可以为0,但不能都为0.如果一个为0,另外一个不为0,那么非0的维数被设定,0维数由布局管理器动态决定。如,设置0行3列,包含10个组件,那么GridLayout会创建固定的3列,并动态生成4行,最后一行包含一个组件。如果设定3行0列,10个组件,那么固定为3行,动态设定4列,最后一行包含2个组件。
2.如果行和列都不为0,行数为主导参数,即行数被固定,列数自动计算生成。如果设定3行3列,10个组件,那么会设置3行固定,4列动态设定,最后一行包含2个组件。如下列所示程序使用网格布局。
如果重新设定框架大小,布局的按钮保持不变,网格布局中所有的组件给出相同的大小。
把line10用setLayout(new GridLayout(3,10))来替换,仍然是3行,2列。如果定义4行2列网格或2行2类网格会怎样?自己试验下。前2种布局,添加组件顺序非常重要,因为它决定自己在容器中的位置。
12.5.3 BorderLayout BorderLayout把容器分为5个区域,东南西北中。通过add(Component, index),添加组件,其中index是以下5个常数之一,BorderLayout.EAST,BorderLayout.SOUTH,BorderLayout.WEST,BorderLayout.NORTH或BorderLayout.CENTER,类图如下图所示。
组件以合适的大小被放置在相应的区域,南北组件可以水平方向延伸,东西组件可以垂直方向延伸,中间组件可以向水平,垂直方向延伸以填满整个空间。如下程序可以说明BorderLayout的布局,在东南西北中添加5个按钮,标签分别为East,South,West,North和Center。
不必要使得组件填满所有的5个区域,如果把East按钮移调,并重新运行程序,会发现中间的按钮会向右延伸并占满East区域。如果add方法中没指明区域,则默认为中间区域,如此添加2个组件,则只有第二个组件会被显示。
12.5.4 布局管理器属性
布局管理器有动态调整的属性。FlowLayout有alignment,hgap,vgap属性。可以使用setAlignment,setHgap和setVgap方法来设定对齐和垂直,水平分割。GrideLayout有rows,columns,hgap和vgap属性,可以使用setRows, setColumns,setHgap和setVgap方法来设定行数,列数即水平和垂直分割。BorderLayout有hgap和vgap属性,可以使用setHgap和setVgap方法来设置水平和垂直分割。
在前面的部分中,因为没有设置布局管理器属性,匿名的布局管理器在发挥作用。如果需要动态的改变属性,那么布局管理器就必须显式被一个变量引用,不能匿名。可以通过变量改变布局管理器的属性值,例如下述代码。
12.6 Panels面板和子容器
假设想要在一个框架中放置是个按钮和一个文本框,按钮按网格布局,但文本框要放置在分开的一行。单单使用一个容器很难达到预期要求。但可以把容器分成几个部分,每个部分中放置一个panel,每个panel有不同的布局方式。Panel是组织界面组件的一个非常有效的子容器,需要先把组件添加到panel上,然后再把panel添加到frame上。
Swing版本的panel是JPanel。Jpanel的默认布局方式为FlowLayout布局,但可以在创建对象时给定它的布局方式,如new JPanel(LayoutManager)。如下方式添加按钮到Panel中。
Panel可以被放置在frame中或另外一个panel中,如下把panel添加到frame中。f.add(p);
下述代码展示了使用panel作为子容器来创建一个微波炉的用户界面。
setLayout方法定义在Container类中。Jpanel是Container的子类,因此可以使用setLayout方法来设置panel的布局方式。为了获得想要的布局,程序使用panel p1,网格布局方式来组织数字按钮,start和stop按钮。面板p2,布局方式为BorderLayout,放置一个文本框在north区域,而面板p1放置center区域。
注意:值得注意的是Container类是所有其他GUI组件类的超类,每一个GUI组件都是一个容器,理论上将,可以使用setLayout方法设置按钮上面的布局方式,添加一个组件到按钮上面,因为所有的Container当中的公共方法都被遗传到JButton类中,但在实践上,却不会想到把按钮作为容器。12.7 Color类
使用AWT包中的Color类可以为GUI组件设置颜色,颜色是由红绿蓝光的三原色组件构造的,每个组件是一个整型值表达梯度(明亮和灰暗程度),从0-255,这就是所谓的RGB颜色模式。
可以使用如下构造方法创建一个颜色对象:
r,g,b分别表示红绿蓝颜色的梯度值(不能超过255,否则会出错),如Color color=new Color(128,100,100);可以使用setBackground(Color c)和setForeground(Color c)方法来设置组件类对象的背景颜色和前景颜色。如下设置一个按钮的背景和前景色。
另外,可以使用13个标准颜色(颜色常量BLACK,BLUE, CYAN, DARK_GRAY, GRAY, GREEN, LIGHT_GRAY, MAGENTA, ORANGE, PINK, RED, WHITE, YELLOW)定义颜色对象,如下设置按钮前景色:
12.8 Font类
使用awt包中的Font类设置组件的字体样式。Font类的构造方法: Public Font(String name, int style, int size);可以选择字体名字,如SansSerif,Serif,Monospaced,Dialog或DialogInput,可以选择字体,如Font.PLAIN(0),Font.BOLD(1), Font.ITALIC(2), Font.BOLD+ Font.ITALIC(3)),用正整数来设定字体大小,如图所示下例。
注意:如果系统支持其他字体,诸如“Times New Roman”,可以使用它来创建一个字体对象。为了找到系统中可用的字体,需要得到一个java.awt.GraphicsEnviroment类的实例,调用它的静态方法getLocalGraphicsEnvironment()。这个类是一个抽象类,描述特定系统的图形环境的,可以使用它的getAllFonts()方法获得当前系统可用的所有字体,如下程序代码。
12.9 Swing GUI组件的一般属性
已经使用过几个GUI组件(如JFrame,Container, JPanel, JButton, JLabel, JTextField)除了这些组件,还有很多其他的GUI组件,因此了解SwingGUI组件的一般特性非常重要。Component类是所有GUI组件和容器类的根类。所有的Swing GUI组件(除JFrame,JApplet,JDialog)都是JComponent的子类。如图列出Comonent,Container,和Jcomponent类常用的用于操纵属性诸如font,color,size等方法。
一个tooltip(提示工具)是当把鼠标移动到组件上时组件上的文本显示,通常描述组件的作用。可以设置JComponent类任何对象的边框。Swing有几种类型的边框,new TitledBorder(String title)创建标题边框,new LineBorder(Color color, int width)创建线框,width是线的粗细。
如下图,程序创建一个panel面板p1,上面放置3个按钮和一个面板p2,上面放置2个label标签,按钮jbtLeft的背景颜色设置为白色,按钮jbtCenter的前景色设置为绿色。按钮jbtRight的文本提示“This is the Right button”,标题边框设置在p1和p2上,线框被设置在label标签上。
注意:对于不同的组件,相同的属性会有不同的默认值,例如,visible属性在JFrame上默认是false,但对于JComponent的任何实例,它的值却是true。12.10 Image Icons 图标是一个固定大小的图像,它很小,通常用来点缀组件,图像通常被保存在图像文件中,java目前支持3中格式的图片:GIF,JPEG,PNG,它们的扩展名为.gif,.jpg或.jpeg,.png。如果有一个bmp(windows支持的图像格式)文件或其他格式的图像,应该使用软件转换为java可用的三种图像格式。
要想显示一个图标,首先应该使用new javax.swing.ImageIcon(filename)创建一个ImageIcon对象,如下使用当前目录中image文件夹下的us.gif文件创建图标。
其中image/us.gif的具体位置为:e:javaimageus.gif,反斜杠是windows的路径标识,在Unix中是正斜杠,在Java中,正斜杠用来表示相对文件路径(相对于java classpath)。
注意:在windows操作系统中,文件名不区分大小写,而在Unix中是区分大小写的。为了确保程序在任何平台都能运行,命名所有的图像文件通常用小写。
图标可以使用new JLabel(imageIcon)或new JButton(imageIcon)显示在按钮或标签上。如下例所示,使用图标创建2个标签和2个按钮。
注意:GUI组件不能被容器共享,一个GUI组件在同一个时间只能出现在一个容器中。因此组件和容器是组合关系。边框和图标可以共享,因此可以创建一个边框或图标,并为任意的GUI组件设置border或icon属性。如下左图为2个面板p1和p2设置边框b,右图为2个按钮jbt1和jtb2设置图标。
第二篇:java GUI图形化界面编程总结
GUI(Graphical User Interface)图形化界面编程总结 Java.Awt:Abstract Window ToolKit(抽象窗口工具包)Javax.Swing:
图形化界面基本设置:
设置窗体大小:setSize(长,宽);
设置窗体位置:setLocation(距离左,距离上);setBounds(长,宽,距离左,距离上);设置布局:setLayout(new FlowLayout()); 使窗体可见:setVisible(true); 事件监听机制:
事件监听机制的特点: 1,事件源。2,事件。3,监听器。4,事件处理。
事件源:就是awt包或者swing包中的那些图形界面组件。事件:每一个事件源都有自己特有的对应事件和共性事件。
监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
以上三者,在java中都已经定义好了。直接获取其对象来用就可以了。
我们要做的事情是,就是对产生的动作进行处理
Eg:编写程序,练习图形化界面编程!import java.awt.*;import java.awt.event.*;import java.io.*;class MyWindowDemo { private Frame f;private TextField tf;private Button but;private TextArea ta;
private Dialog d;private Label lab;private Button okBut;
MyWindowDemo(){ init();} public void init(){ f = new Frame(“my window”);f.setBounds(300,100,600,500);f.setLayout(new FlowLayout());tf = new TextField(60);but = new Button(“转到”);ta = new TextArea(25,70);d = new Dialog(f,“提示信息-self”,true);d.setBounds(400,200,240,150);d.setLayout(new FlowLayout());lab = new Label();okBut = new Button(“确定”);d.add(lab);d.add(okBut);f.add(tf);f.add(but);f.add(ta);myEvent();f.setVisible(true);} private void myEvent(){
okBut.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){
d.setVisible(false);} });d.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){
d.setVisible(false);} });
tf.addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent e){
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showDir();} });
} but.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){
showDir();
} });f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){
System.exit(0);
} });private void showDir(){ String dirPath = tf.getText();
File dir = new File(dirPath);
if(dir.exists()&& dir.isDirectory()){ ta.setText(“");String[] names = dir.list();for(String name : names){
ta.append(name+”rn“);} } else
{
String info = ”您输入的信息:“+dirPath+”是错误的。请重输“;
lab.setText(info);
d.setVisible(true);
} }
public static void main(String[] args){
new MyWindowDemo();} }
菜单:
MenuBar 菜单整体;Menu 包含于MenuBar中;MenuItem包含于Menu中!以上3个关系添加用add();
将MenuBar放进Frame中用setMenuBar();
FileDialog.LOAD:打开的mode FileDialog.Save:保存的mode 练习:一个简易的记事本 /** 写一个关于记事本的小程序 @author田建 @version v1.1 */
import java.awt.*;import java.awt.event.*;import java.io.*;class MyMenuDemo { private Frame f;private TextArea ta;private MenuBar mb;private Menu me;private MenuItem miNew,miSave,miLoad;private File file;
private FileDialog openDia,saveDia;
MyMenuDemo(){
init();}
public void init(){
f=new Frame(”田建--记事本“);
f.setBounds(300,100,650,600);
ta=new TextArea();
//ta.setBounds(302,105,400,300);//f.setLayout(new FlowLayout());//为什么设置成了流式布局之后再设置文本区域没有效果
mb=new MenuBar();
me=new Menu(”文件(F)“);
miNew=new MenuItem(”新建“);
miSave=new MenuItem(”保存(S)“);
miLoad=new MenuItem(”打开(O)“);
mb.add(me);
me.add(miNew);
me.add(miLoad);
me.add(miSave);
f.setMenuBar(mb);
f.add(ta);
openDia=new FileDialog(f,”打开文件“,FileDialog.LOAD);
saveDia=new FileDialog(f,”保存文件“,FileDialog.SAVE);
myEvent();
f.setVisible(true);
}
public void myEvent(){
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
miLoad.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
openDia.setVisible(true);
String dirPath=openDia.getDirectory();
String fileName=openDia.getFile();
if(dirPath==null||fileName==null)
return;
ta.setText(”“);
file=new File(dirPath,fileName);
try
{
BufferedReader bufr=new BufferedReader(new FileReader(file));
String line=null;
while((line=bufr.readLine())!=null)
{
ta.append(line+”rn“);
}
bufr.close();
}
catch(IOException ex)
{
throw new RuntimeException(”读取失败“);
}
}
});
miSave.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(file==null)
{
saveDia.setVisible(true);
String dirPath=saveDia.getDirectory();
String fileName=saveDia.getFile();
if(dirPath==null||fileName==null)
return;
file=new File(dirPath,fileName);
}
try
{
BufferedWriter bufw=new BufferedWriter(new FileWriter(file));
String text=ta.getText();
bufw.write(text);
bufw.close();
}
catch(IOException ex)
{
throw new RuntimeException(”");
}
} });
} public static void main(String[] args){
new MyMenuDemo();}
} 打jar包的过程:
1、编译包 jar –cvf jar名 包名
2、写一个文件main-class: 包名.类名【加个回车】
3、jar –cvfm jar名 文件名 包名
配置jar执行的过程:
工具---文件夹选项---文件类型---新建---文件扩展名jar 然后确定----高级----修改图标-----open------javaw的路径—jar即可!
第三篇:学习java的一些初步体会
Java开发记录
刚开始学java,有很多不明白不是很多是几乎全部,我把自己每学到一点都总结下来让自己感觉更充实也希望以后能为初学者提供帮助。
Java培训第一天
今天正式开始培训,我们满怀喜悦,感觉java一定是一门很高深的技术,幻想着可以写出很多好玩的游戏,做出很多漂亮的网站,可是一开学就蒙了我根本什么都听不懂,虽然假期看了一些java基础,但是老师高浓缩的术语还是让我一头雾水,但还是有那份激情吧,我要学会,第一天就是在迷茫中度过的。老师一直在说现在不懂没关系,以后用长了就好了。每天早上8:30到12:00,下午2:30到6:00晚上8:00到10:30每天接近10个小时的学习还是很充实的,我信心倍增。I believe myself。
Java培训第二天
今天继续讲java基础,老师的节奏很快,说不要把
(前几天耽误了,以后补上)
Java培训第七天
这几天已经基本上走出了前几天的迷茫,感觉还是挺不错的,由开始的什么都不会到现在的知道老师想让我们干什么感觉进步还是满大的,我身边由一个考上北京邮电大学的姐给了我很大的帮助,还有很多学长也很厉害。大家一起学习,我们3个人是大一的也是最没有基础的,有学长的带领和老师的指导进步很快。感觉知识是时间得来的,在学校里我可能4年都学不会这些东西,我说的是真的起码对我是这样。用了两天的时间装环境,把64位系统装成32位的(老师的演示屏幕不支持64位,没办法,前两天时间不紧)后来用了两天的时间就把java基础讲完了,我是什么都不懂,虽然自学了一些但绝对是九牛一毛,专业术语 面向对象、类、封装、继承、多态、反射、跳转、框架、异常捕获、数据库、接口等等反正我是什么都不会怕什么,我开始看书、百度、问学长(不敢问老师因为这样的问题太白痴了)。基础讲完了,没感觉有什么长进,但是感觉好像没有原来那么难理解了,花了2个多小时把基础书看了一遍感觉突然懂了的感觉(呵呵)老师把大量的时间花费在让我们敲代码的上,第一个项目testssh2完全是在老师的指导下一个单词敲的,老师给我们讲公司做项目的框架,我听得晕了src层,docs层,sitting层,webroot层我根本听不懂也不知道这能干什么用,一开始学C感觉C很难,觉得很多事情都是无厘头,但是学了java才觉得java才是真正的霸道,我根本什么逻辑都不用考虑,想实现什么直接调用就OK了,感觉真正写类的人才是大牛。!!今天第二遍将框架和第一遍基本上一样不过项目比原先大了很多基本上是公司的使用框架出了test暂时不写之外其他的都要写,老师给我们建一个example我们自己写一个exercise反正是高度一致,但难度还是挺大的写了一天了还是没有写完,发布了在浏览器上出错,各种错误各种调试,直到想吐。没关系错误就是进步,下面我要开始上课了,就写到这吧,加油myself。
第四篇:gui谷子解读
一、何谓纵横术
《史记六十七卷·仲尼弟子列传》
——存鲁、乱齐、破吴、疆晋而霸越,史称“一石五鸟” ① 游说的前提──量权 ② 游说的出发点──揣情 ③ 游说的顺利发展──摩意 ④ 游说成功的关键──权谋
●纵横术就是把“知己知彼,胜乃不殆”的策略具体运用到人类的思维心理层面上,内设计谋,外陈言辞,动之以形势,诱之以利害,所展开的思维心理战术。●纵横术不是呈一时口舌之辩、转丸其辞的诡辩术,而是融道(原则)、法(方法)、术(技巧)为一体的经典的人类行为理论。
二、理解和运用纵横术的原则 ●道、法、术相结合的原则
——原理、原则;法则、方法;技巧 ●言、情、智相结合的原则 ⊙“泣下沾襟”
——言贵动其情,情贵动其心 ⊙“诱师出屋”
——智贵善其谋。智泽于内,言溢于外 ●《战国策》与《鬼谷子》对照研读
三、纵横术选讲 1.捭阖术
捭阖术是以事物和人物的阴阳类别为法则而展开的言谈语默之术。其目标是料对方之实情,最大限度地获取对方的信诚。所谓“捭之者,料其情也;阖之者,结其诚也”。
“捭”的字面意思是开、言,引申为使之开口说话,或者说服对方接纳己方观点。故曰:“捭者,或捭而出之,或捭而内之。”
“阖”的字面意思是关、默,引申为默认或者拒绝。故曰:“阖者,或阖而取之,或阖而去之。”
捭为阳,在明处;阖为阴,在暗处。调动对方说话之后,对对方所言的情之真伪要暗中有所取舍;让对方确信什么,放弃或忽略什么,也在暗中操作。总论的性质
捭阖篇说:“口者,心之门户也。心者,神之主也。志意、喜欲、思虑、智谋,此皆由门户出入。故关之以捭阖,制之以出入。” A:方法
1.目标:“料其情,结其诚”
⊙料其情:开其金口,观其心志 ⊙结其诚:取同去异,结其信诚
○孔子说:“人心险于山川,难于知天。”(《庄子·列御寇》)怎样打开言谈的局面? 怎样消除分歧,结其信诚? 2.一般方法
①明类:纵向的类与横向的类 ●纵向的类
⊙信任感与认同感等 ⊙制造角色与恶性循环 ●横向的类
⊙好奇心、同情心、恐惧感等 ⊙怎样研究横向的类 ? ② 需要理论
⊙阳类:长生、安乐、富贵、尊荣、显名、爱好、财利、得意、喜欲,以这一类有利的事物来进行游说称为“阳”、称为“始”
⊙阴类:死亡、忧患、贫贱、苦辱、弃损、亡利、失意、有害、刑戮、诛罚,以这一类不利的事物来进行游说称为“阴”、称为“终”
——马斯洛:生理、安全、爱与归属、尊重、认知、美感与自我实现。3.具体方法
①“言善以始其事”;“言恶以终为谋”
●动其行:强调有利的方面诱使对方行动 ●止其谋:强调不利的方面阻止对方行动 ②“与阳言者依崇高”;“与阴言者依卑小” ●“谋之于阳”:以崇高为基调,以高求大 ●“谋之于阴”:以卑小为基调,以下求小
③ “微排其所言而捭反之,以求其实,贵得其指” ——“排抑捭反”与“混说损益”(《内揵篇》)第一步:开而示之同,隐而藏之异。——“阳动而行,阴止而藏” 第二步:借“取同”而“去异”。——“阳动而出,阴隐而入” 第三步:求所言利害之信。——“以阳求阴,苞以德也” ——反面(不可行性)论证 B.技巧
●求所言利害之信的说服技巧 ⊙语言:以第三者立场陈言
⊙心理:聪明的卖马人(《燕策二》)⊙逻辑:两面论证的可能性—论辩 ——晋元帝与明帝司马绍
——“黄金准则”与邓析的 “两可之说”; “濠梁之辩”与“秦赵之约” 死局──僵局──和局 C:原则──道术与术道
●“捭阖者,以变动阴阳,四时开闭,以化万物”;“捭阖之道,以阴阳试之”;“益损、去就、倍反,皆以阴阳御其事”。(《捭阖》)
●“欲捭之,贵周;欲阖之,贵密。周密之贵微,而与道相追。”(《捭阖》)2.反应术 捭阖术讲的是如何以有声的语言探测对方的实情、结取对方的信诚,而反应术则进一步透过有声语言的表层,展开“以无形求有声”的思维心理战术,其目标是“得其情诈”。
“反”就是反观:反观历史、反观对方;“应”亦作“覆”,有“覆验”和“应验”两层意思。所谓“反以知彼,覆以知己”,“反以观往,覆以验来”。A:方法
1.目标:“听真伪,知同异,得其情诈也。” ——《吕氏春秋·淫辞》说:“非辞无以相期” 又说:“从辞则乱”。——《易·系辞》说:“将叛者,其辞惭;中心疑者,其辞歧;吉人之辞寡;躁人之辞多;诬善之人,其辞游;失其守者,其辞屈。” 2.察言观色:以其见者而知其隐者
——东郭牙善辨君子“三色”:钟鼓之色、衰绖之色、兵革之色。(《管子·小问》)3.象比之法:以其隐者而知其见者
——“象其事,比其辞” ; “以无形求有声” ——情、理、类隐而无形 ——“同声相呼,实理同归”
根据事物的常理、常规和人物的常态、常情来推断情之真伪。对于违反常理、常规和常态、常情的现象,要善于冷静观察,其中大多有诈。
——明智的南文子(《宋、卫策》)
——反常的郑袖(《楚策四》)B:技巧
1.钓情术:“钓语合事,得人实也。其犹张置网而取兽也。” ⊙饵钓:物饵与人饵
——齐王后死,《齐策三》 ——申不害答韩王,《韩策一》 ——唐·赵蕤《长短经·钓情篇》:物钓、言钓、事钓、志钓、视钓、贤钓、色钓7种。
⊙善钓:善钓者不用饵,用网。这个网就是以道为纲的反观术。
2.反观术:“反以观往,覆以验今。反以知古,覆以知今。反以知彼,覆以知己。” ⊙“变象比,必有反辞。”
⊙“善反听者,乃变鬼神以得其情。” ——反听、反观、反说与“知己知彼” 反听:庄王伐陈,《吕氏春秋·似顺》 反观:刘邦封雍齿,《经世奇谋·纾祸》 反说:陈轸说昭阳,《齐策一》
——带指针的跪毯 C:原则──道术与术道
●“古之大化者,乃与无形俱生。”“事有反而得覆者,圣人之意也。”(《反应篇》)●“己不先定,牧人不正;事用不巧,是谓忘情失道。”(《反应篇》)——齐桓公的悲惨结局,《智囊·知微》
3.内揵术
捭阖术讲的是如何“料其情,结其诚”,反应术讲的是如何“察言见情”、“得其情诈”。内揵术讲的则是如何建立和不断巩固游说者与游说对象之间的亲密关系。
“内”,入也、纳也。引申为以言辞入结于君;“揵”,关门之木,关合、紧闭。引申为以谋略内结于君。
A:方法
1.目标:“出无间,入无朕,独往独来,莫之能止。” ⊙ “伙伴关系”与“情人关系” “君臣上下之事,有远而亲,近而疏。……日进前而不御,遥闻声而相思。”(《内揵》)
2.为什么追求这一目标? ○感情亲疏对理智判断的影响 ——“信而后谏”(《论语·子张》)
——“周泽既渥,计而不疑,引争而不罪。”(《韩非子·说难》)○兜售智谋,高风险性的职业。3.怎样追求这一目标?
——四种结交方式:“结以道德、结以党友、结以财货、结以采色” ○道德:道术(智)与仁德(心)。内结为帝王之师,外应以良臣之名。
○党友:同党(志、意)与朋友(情、趣)。内结为君王之友,外应以同党之名。○财货:金玉珠帛等(私欲)○采色:土地和美女(私欲)B:技巧
1.进说之阴柔术
——“欲说者务隐度,计事者务循顺。阴虑可否,明言得失,以御其志。” ⊙用其意、御其志
⊙阴隐与柔顺(不触逆鳞)○“十诫与九说”(《韩非子·说难》)2.计事之因化术
——“方来应时,以合其谋。详思来揵,往应时当也。夫内有不合者,不可施行也。乃揣切时宜,从便所为,以求其变。以变求内者,若管取揵。” ⊙往应时当:“时”与“位”
⊙以变求内:“志同、气顺、心合 ”。C:原则──道术与术道
●“不见其类而说之者,见逆;不得其情而说之者,见非。” ●“揣切时宜,从便所为,以求其变。” ●“环转因化,莫知所为,退为大仪。” ——智伯与郄疵、智果(《赵策一》)4.揣术与摩术
揣术与摩术进一步将揣情的空间范围拉大,把揣情与量权和摩意结合起来考虑。“揣”有量权和揣情两种含义。
“摩”即“触摩”之意,谓以事谋去顺合所说服的对象,并诱使他作出回应或者付诸行动。所以说:“摩者,揣之术也。” A.方法
1.目标:“知强弱轻重之称、隐匿变化之动静”
“古之善用天下者,必量天下之权,而揣诸侯之情。量权不审,不知强弱轻重之称;揣情不审,不知隐匿变化之动静。” “计国事者,则当审权量;说人主,则当审揣情。谋虑情欲,必出于此。……故虽有先王之道,圣智之谋,非揣情隐匿,无可索之。此谋之大本,而说之法也。”(《揣篇》)
2.量权、揣情、摩意:谋事的战略战术 ——诸葛亮的“隆中对”,刘备“空手套白狼”,占据荆州和益州,《资治通鉴65卷》 ——郭嘉的“十胜论”,曹操以弱胜强,打败袁绍,《资治通鉴62卷》 ——耳听八方的日本商人 ——8年秘书与龙行天下 B:技巧 1.极情术
⊙“以其甚喜之时,往而极其欲也。”“以其甚惧之时,往而极其恶也。” ——楚成王改立太子,《智囊·狡黠》
⊙“感动而不知其变者,乃且错其人勿与语,而更问其所亲,知其所安。” ——韩非子讲的《韩非子·八奸》
2.摩意术:“微摩之以其所欲,测而探之……是谓塞窖、匿端、隐貌、逃情,而人不知,故成其事而无患。”
——“古之善摩者,如操钩而临深渊,饵而投之,必得鱼焉。”(《摩篇》)⊙“平者,静也”:以平正的方式使之静,不轻举妄动。⊙“正者,直也”:以正当的方式使之直道而行。⊙“喜者,悦也”:以对方所喜欲的事情使他欢悦。⊙“怒者,动也”:以对方所厌恶的事情使他冲动。⊙“名者,发也”:通过显扬对方的名声来诱动对方。⊙“行者,成也”:协助对方行动,使之获得成功。⊙“廉者,洁也”:以贞洁的行为诱动对方
⊙“信者,期也”:以诚信的方式使对方所期待的事情兑现。⊙“利者,求也”:用利益之事诱使对方去追求 ⊙“卑者,谄也”:以低下的言辞或行为打动对方 ——幸运的奥迪:行者,成也;信者,期也。
——《文汇读书周报》,遭遇荷兰“红宝书”:卑者,谄也 C:原则──揣、摩之道
●“揣情饰言,成文章而后论之。” ●“摩之以其类”,“摩之以其欲”。●“道、数与时相偶者也。”
——郑武公伐胡,《韩非子·说难》
——江乙善谋,安陵君(楚成王的宠臣安繵)知时,《楚策一》
5.抵巇术
抵为抵塞,巇为罅隙、裂缝。抵巇就是把有缺漏的地方堵塞住。抵巇术讲的是如何弥缝事情的罅隙,使事情免于溃败的技术。
“物有自然,事有离合。”“自天地之合离终始,必有巇隙,不可不察也。察之以捭阖,能用此道,圣人也。”
——墙崩因隙,器坏因衅。因隙衅而击实之,则墙器不败。若不可救,则因而除之,另有所营置。人事也是如此。A:方法
1.目标:能因能循,为天地守神。2.“因”:危险的兆头刚萌生便觉察之
“事之危也,圣人知之,独保其用,因化说事,通达计谋,以识细微。经起秋毫之末,挥之于太山之本。”
——缝隙乃祸之端始 3.“循”:因衅隙而救之或除之
“圣人者,天地之使也。世无可抵,则深隐而待时;时有可抵,则为之谋。”
——缝隙乃谋生之地 4.何谓萌芽巇罅?
“天下纷错,上无明主,公侯无道德,则小人谗贼,贤人不用,圣人窜匿,贪利诈伪者作,君臣相惑,土崩瓦解而相伐射,父子离散,乖乱反目,是谓萌芽巇罅。圣人见萌芽巇罅,则抵之以法。” 5.抵巇五法
⊙抵而塞:隙漏如果由内部引起,则抵而塞(塞住)⊙抵而却:隙漏如果由外部引起,则抵而却(挡退)⊙抵而息:隙漏如果由下面引起,则抵而息(平息)⊙抵而匿:隙漏如果由上面引起,则抵而匿(藏匿)⊙抵而得:隙漏如果无法救治,则抵而得(取而代之)
——这五者可归为两类:抵而塞之与抵而得之。事情还有挽救的余地,则抵而塞之;若不可挽救,则抵而得之。B:技巧
⊙如何因应事物发展的变隙而加以防治 ⊙如何因应事物发展的变隙而使之溃败 ——如何设置计谋的技巧,参见谋术 C:原则──道术与术道
●“物有自然,事有合离。有近而不可见,远而可知。近而不可见者,不察其辞也;远而可知者,反往以验来也。”
●“兆萌牙孽之谋,皆由抵巇,抵巇隙为道术用。”
6.飞箝术
“飞”就是飞扬褒奖;“箝”就是钳制约束。
飞箝术言取人之道,先作声誉以飞扬之,彼必露情竭志而无隐,然后因其所好,牵制约束,使之不得脱离的役使人才之术。A:方法
1.目标: 空往而实来,缀而不失 ——一文钱骗术,《智囊·狡黠》;办学者 2.征召人才:“度权量能,征远来近。” ——燕昭王招贤纳士
3.役使人才:“量智能,权材力” ;“审其意,知其所好恶” ——庞统当总参谋长;晋文公提升箕郑 B.役使人才之术
①先征之而后重累。使贤才:征来后累以重任,如诸葛亮,鞠躬尽瘁,死而后已 ②先重累而后毁之。使干才:如诸葛亮用魏延 ③量能立势以钩之
讲效率:对人迫之以势,如驾重车下山的辕马 ④伺候见间而箝之
讲手段:利用人的缺陷箝制约束,使之不得脱也。如曹操见“间”而箝徐庶;司马熹使赵造“间”而箝中山王。钱锺书的《围城》。⑤称财货、珠玉、璧帛、采色以事之 养闲人:如孟尝君的“鸡鸣狗盗”之徒 C:原则──道术与术道 ●“察同异,别是非之语。” ——用人有道
●“见内外之辞,知有无之数。” ——知人有数
●“决安危之计,定亲疏之事。” ——役人者,手操的是双刃剑
7.权术与谋术
“权”:古代秤砣叫权,权衡轻重的意思。在这里指的是在游说中,对所使用的语言、谈话的技巧和所说服的对象,要加以谨慎的权衡和选择。
“谋”:谋就是思虑、计谋。《说文》:“虑难曰谋。”虑人难、虑事难、参立难,将这三难解决好了,计谋就会应运而生。
权谋术讲的是如何选择言谈的技巧和如何权衡游说的对象,针对人类行为的弱点和事物发展变化的衅隙,见隙而谋的谋略技术。A:“权”的方法和技巧
1.目标:“繁言而不乱,翱翔而不迷,变易而不危,睹要得理。” 2.五种可选择的言语方式 ●佞言者,谄而干忠 ●谀言者,博而干智 ●平言者,决而干勇 ●戚言者,权而干信 ●静言者,反而干胜
3.五种忌讳和可利用的言语方式 ●病者,感衰气而不神 ●怨者,肠绝而无主 ●忧者,闭塞而不泄 ●怒者,妄动而不治 ●喜者,宣散而无要
——“心安静则神策生,虑深远则计谋成”
4.“见人说法”九种 ①与智者言依于博 ②与博者言依于辩 ③与辩者言依于要 ④与贵者言依于势 ⑤与富者言依于高 ⑥与贫者言依于利 ⑦与贱者言依于谦
⑧与勇者言依于敢 ⑨与过者言依于锐 B:“权”之道
●“言多类,事多变,终日言不失其类。” ●“智贵明,辞贵奇。”
——改姓辅氏的智果与出使齐国的郄疵《赵策一》 ——靖郭君田婴与“海大鱼”,《齐策一》 C:何为计谋
“凡谋有道,必得其所因。”“故因其疑以变之,因其见以然之,因其说以要之,因其势以成之,因其恶以权之,因其患以斥之。摩而恐之,高而动之,微而证之,符而应之,拥而塞之,乱而惑之,是谓计谋。” ——乱而惑之:张巡与安禄山玩草人借箭 D:如何设立计谋
①“度材、量能、揣情,事之司南也。” ——设立计谋的指南
②“变生事,事生谋,谋生计。” ——事物发展的变隙乃谋生之地 ③“参以立焉,以生奇”
——仁、智、勇三才:参立难。“仁人轻货,不可诱以利,可使出费;勇士轻难,不可惧以患,可使居危;智者达于数,明于理,不可欺以不诚,可示以道理,可使立功。” E:计谋之用
①“公不如私,私不如结,结而无隙者也。”(私,隐密;结,同心;谋生于有隙,用于无隙)
②“正不如奇(奇,因事机发),奇流而不止者也。” ③“可知者,可用也;不可知者,谋者所不用也。” F:“谋”之道
●“用于众人之所不能知,用于众人之所不能见。” ●“圣人之道,在隐与匿。” 8.决疑术
决疑术是按着“度以往事,验之来事,参之平素”的法则而进行的决疑断惑之术。其宗旨在于说明有哪些事情值得我们费心力去做决断,并教我们如何去下决断。自古以来,善决疑者致福,不善决疑者有殃。决疑是极难为而又影响深远之事,所谓“决情定疑,万事之机,以正治乱,决成败,难为者”。A:方法与技巧
●“决情定疑,万事之机,以正治乱,决成败,难为者。故先王乃用蓍龟者,以自决也。”
●五种值得决断的事情
⊙“王公大人之事也,危而美名者” ⊙“不用费力而易成者”
⊙“用力犯勤苦,然不得已而为之者” ⊙“去患者” ⊙“从福者”。●五种决断方式 ⊙决之以“阳德” ⊙决之以“阴贼” ⊙决之以“信诚” ⊙决之以“蔽匿” ⊙决之以“平素” B:原则
●“度以往事,验之来事,参之平素” 结束语:
一、纵横术与儒家哲学
——道德问题:德与术;“德养五气,心能得一,乃有其术。”
二、纵横术与道家哲学
“无为而求,安静五脏,和通六腑,精神魂魄固守不动,乃能内视、反听,定志虑之太虚,待神往来。以观天地开辟,知万物所造化,见阴阳之终始,原人事之政理。”
——老子的“无为”与庄子的“无我”
三、纵横术的现代意义
●日常生活:人生的游戏色彩
●职业技术:治国、外交、企业管理… ——读孔子之言,行仪秦之事 ——“内圣外王”与“胜者为王”
第五篇:关于GUI的一点心得体会
[Fig文件方式,即使用菜单File->New->GUI来设计界面] 首先值得注意的是,在低版本matlab上 制作的含GUI的m文件一般不能在高版本的matlab上面运行,但是从7.0版开始改进了一点,我试过 6.5版的含GUI的m文件可以在 7.0版上运行,但如果在7.0版上面修改过.fig文件,那么就不能回到6.5版上运行了(显示一堆错误,我没看懂,不知道能否通过修改使之重新可在 6.5版上运行,呵呵),而在7.0版上制作的含GUI的m文件就完全不能放到6.5版上运行了(也是同样的错误)。这可能是因为matlab各版本在 GUI上改动较大,所以都不支持向下兼容。也许兼容性差是使用GUI编写程序的最大麻烦。
其次,说说使用GUI的好处。不知道是否承袭了VC or BCB的习惯,我比较喜欢编写完程序后按快捷键运行(此时会自动保存m文件),但是,对于程序有输入参数的 时候,如果不采用GUI方式,这显然是行不通的――当然了,可以在command window按“向上”键然后重新改写你想要的参数。对于一些较大型的程序,正因为我比较偏向于按F5运行程序,所以我会选择使用GUI方式。不过GUI 方式的好处就远不止于此了,它可以把几个功能相关的模块集中起来,使得不需要重新关闭、运行就能得到不同的结果,便于比较;可以减少figure满天飞的现象,这在matlab中尤为明显;便于交互式地观看不同的数据,例如在我处理的fMRI问题中,希望观看每个三维点对应的时间序列,这时候需要提供交互式的选择„„不过,尽管GUI有很多好处,但是其缺点也是有的,除了上面提到的兼容性(移植性)以外,要管理、维护一个GUI界面也是比较麻烦的,相信有其他语言的界面设计经验的朋友也知道这点。
再 者,对GUI问题,说说我的一点经验吧。其实,matlab已经在这方面改进了不少,从控件的增加和教程的学习都可以看出来。例如6.5版本是没有 Panel和Button Group这两个控件的,在2006a版本中就新增了这两个控件(这个好像7.0版就有了,不确定);教程方面,也使用了最为直观的视频教学方式,建议新手看看Creating a GUI with GUIDE 和Creating Graphical User Interfaces两节。所以,操作上的细节我就不多讲了,自己摸索一下就ok了。至于编程时最为关键的参数传递问题,可以参考本论坛或者仿真论坛上面的“函数结构与参数传递”一文,作者整理得较完整,不过有点难懂。这里我简单说一下吧:
[转cwit]关于参数传递的方法:
1.在内存中提取:① 采用function的varargin和varargout传送,② 存在handle的ApplicationData中,③保存在handles里面。当然还有其他方法; 2.存在硬盘上,采用save和load;
3.用全局变量,最次的办法,有时却是最好的办法;
我想,对于这里处理的GUI问题,一般不会用到save和load命令(要 从mat文件读取数据初始化或者把数据存储到mat文件中例外),“function的varargin和varargout传送”的方法也不较少使用(因为对于控件的回调函数,matlab规定了输入参数为“hObject, eventdata, handles, varargin”,且一般没有返回值,所以不同于自定义的函数),所以剩下的方法就只有三种了: 1.存在handle的ApplicationData中――利用setappdata函数将数据保存在对象的“ApplicationData”属性中,利 用getappdata函数从对象的“ApplicationData”属性中提取数据,如果没有定义,就为空。例如,假设figure的tag属性是 figure1,则setappdata(handles.figure1,’A’,A)就可以把变量A存放到figure1的 “ApplicationData”属性中,名字为A,而B = getappdata(handles.figure1,’A’)就可以把figure1的“ApplicationData”属性中名字为A的变量赋给 B。setappdata和getappdata操作的对象,最好为figure_handle,便于管理和扩展。Matlab的高级编程和对象控制,将 大量使用这两个函数[转自cwit];
2.保存在handles里面――首先,这是访问控件的常用方法,注意到Tag是唯一标识控件的属性,也就说,如果一个控件的Tag属性是a,那么,在fig 对应的m文件中,只要含有“handles”作为其输入参数的函数中,就可以使用handles.a对该控件进行访问。既然句柄(相当于其他语言中的指 针)已经拿到手了,就任由“宰割”了(例如设置属性、存取数据等就比较容易了);其次,可以利用这种方法把自定义的变量保存在handles里面进行存取,这在matlab帮助的Creating a GUI with GUIDE一节中有具体介绍,不多说;
3.用全局变量的方法――这是我进行参数传递的常用方法,使用方法是:在两个函数体(当然可以是多个了,这里是主函数和子函数的意思)中使用前加入语句 “global A”,其中A是多个函数需要传递的变量名,多个变量用空格格开,句末不需要加分号。这种方法由于存放在硬盘上,存取速度会减慢,但是如果变量个数不多、或 者对该变量引用的函数不多,可以考虑用此办法(我尚未能领会cwit兄所说“最次的办法,有时却是最好的办法”之含义)。
至于其他有关GUI命令、控件属性和图形属性可以参考matlab的帮助,或者参考“GUI命令大全”、《精通GUI图形界面编程》(这两个本论坛有)、“Matlab图形图像属性”、“GUI.rtf”(这两个参见附件,后者下载后手动修改一下后缀名)。实际上,用得比较多的控件属性不外乎以下几种(高手例外):
Visible属性,例如axes、edit、button等,格式:set(handles.***, ‘Visible’, ‘on’);或者set(handles.***, ‘Visible’, ‘off’);
String属性,例如edit、text等,格式:str=get(handles.***, ‘String’)或set(handles.***,’String’,str);Enable属性,例如edit、button、text等,格式:set(handles.***, ‘Enable’, ‘on’);或者set(handles.***, ‘Enable’, ‘off’);
Value属性,例如radio button、check box等,格式:a=get(handles.***, ‘Value’)或set(handles.***,’Value’,1);或set(handles.***,’Value’,0);
留意一下响应函数的注释部分,有时候会得到提示的。例如,我的 matlab 2007a 中,在设计界面上增加了 listbox 控件后,m 文件的对应回调函数处显示如下:
%---Executes on selection change in listbox1.function listbox1_Callback(hObject, eventdata, handles)% hObject handle to listbox1(see GCBO)% eventdata reserved100*k/N)<= 1e-003 waitbar(k/N);i = i + step;end 其中i是控制进度条在何处刷新,k是程序的循环变量,N是程序循环的总次数。
使用 uicontrol 方式实现进度条的示例: 复制内容到剪贴板 代码: figure;e1 = uicontrol(gcf,'style','edit','BackgroundColor','w',...'unit','normalized','position',[0.35,0.6,0.02,0.25]);e2 = uicontrol(gcf,'style','edit','BackgroundColor','r',...'unit','normalized','position',[0.3525,0.6,0.015,0.01]);drawnow;n = 1000;ii = 1;for i = 1:0.01:n if(ii-100*i/n)<= 1e-003 set(e2,'position',[0.3525,0.6,0.015,0.01+0.24*i/n]);drawnow;ii = ii + 1;end end 【附录】转自cwit兄:
m文件与fig文件创建figure的十大差异——用代码写figure,并不是麻烦。如果你习惯了,或者熟悉了,会发现用代码实现guide编程,比GUI方便很多,功能也很强大。用m文件实现guide编程,相比GUI编程有几大差异: 1.代码可复用,节省成本;
2.GUI不能灵活创建uimenu,并且不能编辑其所有属性; 3.GUI还没有实现创建uitoolbox; 4.GUI不能创建所有axes的子对象;
5.写界面也有一些算法,在GUI中无法实现。而用m文件就可以实现在不同窗口尺寸下给对象以合适的位置; 6.m文件可以生成非常复杂的界面;
7.采用GUI编程,代码编译后依赖于*.fig文件; 8.m文件可以实现组件;
9.m文件创建的对象,可以方便的在handle中存取数据; 10.m文件可以将创建对象代码与动作执行代码很好的结合起来。
【注】关于两种方式的运行:
对于fig文件方式:fig文件记录的是控件的布局和属性等资源信息,m文件记录的是控件的响应消息(这是个人理解,更准确的介绍请参阅有关GUI的书籍,我懒得去查了,呵呵),两者缺一不可。所以,不能通过打开fig文件(如菜单中的Open命令)来运行该GUI,这种方式的运行方法有两种:打开该GUI对应的m文件,然后像普通m文件那样运行;打开该GUI的设计界面(菜单操作:FileNewGUIOpen Existing GUI,打开 fig 文件),然后点击设计界面工具栏上的那个像箭头一样的按钮
对于m文件方式:像普通m文件那样运行就可以了
先建立两个GUI,一个名为guidata1.fig guidata2.fig,它们的tag属性也分别为guidata1,guidata2。然后在guidata1.m中的opening function中加入下列语句:
setappdata(handles.guidata1,'Sai',1);
在guidata2.m中的opening function 中写入下列语句:
setappdata(handles.guidata2,'Sai',2);
下面我们分别在guidata1.fig guidata2.fig中放一个按钮和静态文本。接下来,在guidata1.m的按钮中加入下列程序:
guidata21=findobj('Tag','guidata2');if isempty(guidata21),errordlg('Not Open guidata2.fig','Error');
guidata22=guidata2();
Sai=getappdata(guidata22.guidata2,'Sai');
set(handles.text1,'String',num2str(Sai));else
guidata22=guihandles(guidata2);
Sai=getappdata(guidata22.guidata2,'Sai');
set(handles.text1,'String',num2str(Sai));end
在guidata2.m中的按钮中加入下列程序:
guidata12=findobj('Tag','guidata1');%查看guidata1.fig是否打开 if isempty(guidata12), %如果没有打开
guidata11=guidata1();%打开guidata1.fig,并且把句柄给guidata11
guidata11=guihandles(guidata11);%把guidata11转为可用的gui句柄
Sai=getappdata(guidata11.guidata1,'Sai');%读取句柄guidata11中的名为Sai的变量值,可以和其%%%%%%%%%opening function 中的对比setappdata(handles.guidata1,'Sai',1)
set(handles.text1,'String',num2str(Sai));else
guidata11=guihandles(guidata1);
Sai=getappdata(guidata11.guidata1,'Sai');
set(handles.text1,'String',num2str(Sai));end
然后随便打开某个fig文件,比如打开guidata1.fig,然后点其中的按钮,可以看到下面的静态文本上显示2,那么这个自然是从guidata2.fig中读出来的。而且会自动打开guidata2.fig.这里其实是用findobj首先看是否已经打开guidata1,如果没有打开,则打开,并将句柄转化为gui句柄。我在opening function 中是将名为Sai,值为1的变量存在了figure中,其实也可以存在其他控件中,比如在按钮上加一个应用程序数据其名为Sai,值为1,那么可以这么写 setappdata(handles.pushbutton1,'Sai',1),然后随时我们都可以通过getappdata setappdata来获取或设置其值。
而这里我推荐用这两个命令,如果你用handles来共享数据的话,一是他可能会被程序的其他控件改变,二是它容易和引用控件时想混淆。