概念:
GUI(Graphical User Interface):图形用户接口。
GLI(Command line user Interface):命令用户接口。
Awt:Abstract window Toolkit:抽象接口工具包。
java.Awt :重量级控件 更依赖系统。
javax.Swing:即xwt 属轻量级控件 依赖系统降低。
GUI组件分为两大类:基本组件和容器。分别是java.awt.Component和java.awt.Container的直接或间接子类。容器也算是组件,只是特殊的组件。所以java.awt.Container也是java.awt.Component的子类。
Component:
Component类是所有组件的父类。
1 组件的颜色
public void setBackground(Color c); //设置组件的背景色
public void setForeground(Color c); //设置组件的前景色
public Color getBackground(Color c); //获取组件的背景色
public Color getForeGround(Color c); //获取组件的前景色
Color类是Java.awt包中的类。用Color类的构造方法public Color(int red,int green,int blue)可以创建一个颜色对象,三个颜色值取值都在0-255之间。Color类还有red,blue,green,orange,cyan,yellow,pink等静态常量。
2 组件的字体
public void setFont(Font f); //设置组件上的字体
public Font getFont(Font f); //获取组件上的字体
public Font(String name,int style,int size); //构造方法
1)name:字体名称,如果系统中无该字体,则取默认的字体名字。
2)style:字体的式样,取值是一个整数,其有效取值为:
Font.BOLD,Font.PLAIN,Font.ITALIC,
Font.ROMAN_BASELINE,Font_CENTER_BASELINE,Font.HANGING_BASELINE,
FOnt.TRUETYPE_FONT
3)size:字体的大小,单位是磅(如5号字体是12磅)。
4)获取系统中有哪些字体名字可用的方法:
GraphicsEnvironment ge=GraphicsEnvironment getLocalGrphicsEnvironment();
String fontName[]=ge.getAvailableFontFamilyNames();
3 组件的大小与位置
public void setSize(int width,int height); //设置组件的大小(宽度和高度)
public void setLocation(int x,int y); //设置组件在容器中的位置,左上角坐标为(0,0)
public Dimension getSize(); //返回组件的大小(组件的宽度和高度)
public Point getLocation(int x,int y); //返回组件有容器中的位置(左上角坐标)
public void setBounds(int x,int y,int width,int height); //设置组件在容器中的位置及组件大小
public Rectangle getBounds(); //返回组件在容器中的位置和大小
4 Rectangle对象的常用方法
Rectangle(int x,int y,int width,int height); //构造方法
public boolean intersects(Rectangle rect); //判断当前矩形是否和rect相交
public boolean contains(int x,int y); //判断当前点(x,y)是否在当前矩形内
public boolean contains(int x,int y,int width,int height);//矩形是否包含参数指定的矩形
public boolean contains(Rectangle rect); //同上
public Rectangle intersection(Rectangle rect); //得到当前矩形与rect相交部分所构成的矩形,如不相交则返回null。
public Rectangle union(Rectangle rect); //得到同时包含当前矩形和rect的最小矩形
5 组件的激活与可见性
public void setEnabled(boolean b);//设置组件是否被激活
public boolean isEnabled();//判断组件是否为激活状态
public void setCisible(boolean b);//设置组件是否可见
public boolean isVisible(); //判断组件是否可见
6 Component下的主要的子孙类组件:
1)Container:是容器,是component的一个子类是一个特殊的组件,该组件可以通过add方法添加其他组件进来。setlayout(LayoutManager mgr)方法设置此容器的布局管理器。设置界面的布局。
Container常用的方法有:
public void addContainerListener(ContainerListener l)//添加指定容器的侦听器,以接收来自此容器的容器事件。
public void remove(Component comp)//从此容器中移除指定组件。
public void removeAll()//从此容器中移除所有组件。
public void setFont(Font f)//设置此容器的字体。
public void setLayout(LayoutManager mgr)//设置此容器的布局管理器。
2)Window:描述的是一个没有边框和菜单栏,可自由停靠的顶层容器(是指不允许将其包含于其他容器中)一般不直接使用该类,二十使用子类Frame。
Window常用方法有:
public void addWindowListener(WindowListener l)//添加指定的窗口侦听器,以从此窗口接收窗口事件。
public void pack()/调整此窗口的大小,以适合其子组件的首选大小和布局。
public void setBounds(int x, int y, int width, int height)//移动组件并调整其大小。
public void setSize(int width, int height) //调整组件的大小,使其宽度为 width,高度为 height。
public void setVisible(boolean b) //根据参数 b 的值显示或隐藏此 Window。
3)Frame:
是代表屏幕上Window的对象。你可以把button checkbox text字段等接口放在window上面。标准的menu也可以加到上面,并且能够带最小化 最大化 关闭等图标。
Frame类常用方法:
Frame():构造方法,无标题,默认布局为BorderLayout。
Frame(String s):构造方法,窗口标题为s,默认布局为BorderLayout。
public void setBounds(int a,int b,int width,int height):设置窗口左上角位置及窗口大小。
public void setSize(int width,int height):设置窗口大小,默认位置是(0,0)。
public void setVisible(boolean b):设置窗口是否可见,默认是不可见的。
public void setTitle(String s):设置窗口标题。
public void setResizable(boolean b):设置窗口是否可调整大小,默认是可调整的。
String getTitle():获取窗口的标题。
boolean isResizable():获取窗口是否可调整大小的消息。
public void validate():确保当前窗口中添加的组件显示出来。当窗口调用了方法setSize或setBounds调整大小后,都应该调用方法validate。
public void dispose():撤消当前窗口,释放当前窗口所使用资源。
4)Panel:最简单而常用的容器,课作为容器包含其他组件,但是不能独立存在,必须被添加到其他容器中;panel的方法有:
Panel()//使用默认的布局管理器创建新面板。
Panel(LayoutManager)// 创建具有指定布局管理器的新面板。
public void addNotify()//创建 Panel 的同位体。
public AccessibleContext getAccessibleContext()//获取与 Panel 相关的 AccessibleContext。
5)Botton:Button类的常用方法有:
Button()//构造方法,按钮没有名称。
Button(String s)//构造方法,按钮名称为s。
public void setLabel(String s)//设置按钮名称。
public String getLabel()//获取按钮上的名称。
public void addActionListener(ActionListener)//向按钮增加动作监视器。
public void removeActionListener(ActionListener)//删除按钮上的动作监视器。
public setActionCommand(String command)//设置按钮发生ActionEvent事件相关的字符串命令,默认的字符串命令是按钮上的名称。
6)Lable:
标签的功能只是显示文本,不能动态地编辑文本。
Label类的常用方法有:
Label()//构造方法,标签上没有名称。
Label(String s)//构造方法,标签上的名称是字符串s,名称靠左对齐。
Label(String s,int alignment)//构造方法,标签名称是s,alignment是对齐方式,其取值为:Label.LEFT,Label.RIGHT,Label.CENTER。
public void setText(String s)//设置标签上的名称。
public String getText()//获取标签上的名称。
public void setAlignment(int alignment)//设置标签上名称的对齐方式。返回值是:Label.LEFT,Label.RIGHT,Label.CENTER。
7)CheckBox:
getLabel()//获取此复选框的标签。
getState()//确定此复选框是处于“开”状态,还是处于“关”状态。
setLabel()//将此复选框的标签设置为字符串参数。
setState()//将此复选框的状态设置为指定状态。
8)
TextArea:
文本区可以输入多行文本,其主要方法有:
TextArea()//构造方法,创建的文本区对象的行数和列数取默认值。
TextArea(String s)//构造方法,创建的文本区初始字符串为s,文本区有水平和垂直滚动条。
TextArea(int x,int y)//构造方法,创建的文本区对象的行数为y,列数为x,文本区有水平和垂直滚动条。
TextArea(String s,int x,int y)//构造方法,创建的文本区对象的初始字符串为s,行数为y,列数为x,文本区有水平和垂直滚动条。
TextArea(String s,int x,int y,int scrollbar)//构造方法,创建的文本区对象的初始字符串为s,行数为y,列数为x,scrollbar取值:
/*
TextArea.SCROLLBARS_BOTH
TextArea.SCROLLBARS_VERTICAL_ONLY
TextArea.SCROLLBARS_HORIZONAL_ONLY
TextArea.SCROLLBARS_NONE
*/
public void setText(String s)//设置文本区中的文本为s。
public String getText()//获取文本区中的文本。
public void setEditable(boolean b)//设置文本区是否可编辑,默认为可编辑的。
public boolean isEditable(boolean b)//文本区可编辑时,返回true,否则返回false。
public void insert(String s,int x)//向文本区指定的位置x(文本区开始处字符的个数)插入指定文本s。
public void replaceRange(String s,int start,int end)//用字符串s替换从指定位置start开始到指定位置end结束的文本。
9)TextFiled:
文本框可以输入单行文本,其主要方法有:
TextField()//构造方法,创建文本框长度为一个字符长的文本框对象。
TextField(int x)//构造方法,创建的文本框长度为x个字符长。
TextField(String s)//构造方法,创建的文本框初始字符串为s。
TextField(String s,int x)//构造方法,创建的文本框初始字符串为s,文本框长度为x个字符长。
public void setText(String s)//设置文本框中的文本为s。
public String getText()//获取文本框中的文本。
public void setEchoChar(char c)//设置文本框中的回显字符,只显示字符c。
public void setEditable(boolean b)//设置文本框是否可编辑,默认为可编辑的。
public void addActionListener(ActionListener)//向文本框增加动作监视器。
public void removeActionListener(ActionLisener)//删除文本框上的动作监视器。
文本框监视器处理事件的接口方法:
public void actionPerformed(ActionEvent e)
当在文本框中输入字符并回车时,ActionEvent类自动创建一个事件对象,并将它传递给方法actionPerformed(ActionEvent e)中的参数e,监视器将自动调用方法actionPerformed()对发生的事件作出处理。
对于文本框事件源,可以发生ActionEvent事件。
发生ActionEvent事件的事件源获得监视器的方法是addActionListener(监视器)。
处理发生ActionEvent事件的接口是ActionListener,该接口中只有一个方法actionPerformed(ActionEvent e)。
ActionEvent类中的方法有:
public Object getSource()//获取发生ActionEvent事件的事件源对象的引用。
public String getActionCommand()//获取发生ActionEvent事件时和该事件相关的一个命令字符串(文本框中的文本字符串)
常见的布局管理器:
FlowLayout(流式布局管理器):从左到右的顺序排列,panel默认的布局管理器。
BorderLayout(边界布局管理器:东南西北中,Frame默认的布局管理器,不设置就会居中填充。
GildLayout(网络布局管理器):规则的矩阵
CardLayout(长布局管理器):选项卡
GridBagLayout(网络布局管理器):非规则的矩阵
提示:开启图形化界面就会多一个线程。
创建图形化界面的步骤:
1.创建Frame窗体
2.对窗体进行基本设置,比如大小位置和布局。
3.定义组件
4.将组件通过窗体的add方法添加到窗体中
5.让窗体显示,通过setVisible(true)(一般关闭一个窗口的顺序是:setVisible(false)---隐藏窗口; dispose()---释放窗口资源; System.exit(0)---退出程序;)
事件监听机制的特点:
1.事件源 2.事件 3.监听器 4.事件处理
事件源:就是awt包或者swing包中的那些图形界面组件。
事件:每一个事件源都有自己特有的对应事件和共性事件
监听器:将可以触发某一个事件的动作(不止一个动作)都已经封装到监听器中。
以上三者,在java中都已经定义好了,直接获取其对象来用就可以了,我们要做的事情是,就是对产生的动作进行处理。
窗口事件Windowevent:
Frame是Window的子类,凡是Window子类创建的对象都可以引发WindowEvent类型事件,即窗口事件。
WindowListener接口
当一个Frame窗口被激活、撤销激活、打开、关闭、图标化或撤销图标化时,就引发了窗口事件,即WindowEvent创建一个窗口事件对象。
窗口使用addWindowListener方法获得监视器,创建监视器的对象的类必须实现WindowListener接口,该接口中有7个不同的方法:
public void windowActivated(WindowEvent e); //当窗口从非激活到激活状态时监视器调用该方法
public void windowDeactivated(WindowEvent e); //激活到非激活状态
public void windowClosing(WindowEvent e); //窗口正被关闭
public void windowClosed(WindowEvent e); //当窗口关闭时
public void windowIconified(WindowEvent e); //当窗口图标化时
public void windowDeiconified(WindowEvent e); //当窗口撤销图标化时
public void windowOpened(WindowEvent e); //当窗口打开时
注:当单击窗口上的关闭图标时,监视器首先调用windowClosing方法,如果在该方法中使用System.exit(0);退出程序的运行,那么监视器就没有机会再调用windowClosed方法了。
当单击窗口的图标化按钮时,监视器调用windowIconified方法后,还将调用windowDeactivated方法。当撤销窗口图标化时,监视器调用windowDeiconified方法后还会调用windowActivated方法。
WindowAdapter适配器:
适配器可以代替接口来处理事件,当Java提供处理事件的接口中多于一个方法时,Java相应地就提供了一个适配器类。适配器已经实现了相应的接口,如WindowAdapter实现了WindowListener接口。因此,可以使用WindowAdapter的子类创建的对象做监视器,在子类中重写所需要的接口方法即可。例子程序如下
class Mywin implement WindowListener{
//覆盖7个方法,可是只用到了关闭的动作
//其他动作都没有用到,可是必须复写
//这样将会十分麻烦
}
为了解决要实现WindowListener监听器就必须要复写多达七个方法的这个问题WindowListener的子类WindowAdapter已经实现了WindowListener接口,并覆盖了所有方法,那么只需要继承Windowadapter覆盖需要的方法即可:
class Mywin extends Windowadapter{
public void windowClosing(Windowevent e){
System.exit(0);
}
}
其中System.exit(0)的作用是 退出java虚拟机。
注意要把事件和图形化组件分离,代码如下:
窗口关闭:
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FrameDemo {
private Frame f;
private Button b;
FrameDemo() {
init();
}
private void init() {
f = new Frame("my frame");
// 对frame进行基本设置
f.setBounds(200, 100, 500, 600);
f.setLayout(new FlowLayout());
b = new Button("my button");
// 将组件添加到frame中
f.add(b);
// 加载一下窗体事件
myevent();
// 显示窗体
f.setVisible(true);
}
private void myevent() {
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
给按钮b添加一个键盘监听:
but.addkeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
System.out.println(e.getKeyChar()+"..."+e.getKetCode());
}
});
KeyEvent.getText(e.getKeyCode())该方法能获取shift ctrl等“功能”字符串
e.getKeyChar()只能获取小写字母。
组合键:
but.addKeyListener(new KeyAdapter(){
public void KeyPressed(KeyEent e){
if(e.isContorlDown()&&e.getKeyCode()==KeyEvent.vk_ENTER)
System.out.println("ctrl + enter is run");
}
});
InputEvent的consume()方法:
使用此事件,以便不会按照默认的方式由产生此事的源代码来处理此事件。
事例代码:
tf.addKeyListener(new KeyAdapter(){
public void KeyPressed(KeyEvent e){
int code=e.getKeyCode();
if(!(code>=KeyEvent.vk_)&&code
菜单:
继承关系:
menuItem-->menu-->menuBar
菜单项放在菜单里,菜单放在菜单条里。
1.菜单条(Menubar)
Frame类有一个将菜单条放置到窗口中的方法:setMenuBar(MenuBar bar);该方法将菜单条添加到窗口的顶端。注意:只能向窗口添加一个菜单条。
2.菜单(Menu)
Menu类的主要方法有:
Menu()//建立一个空标题的菜单。
Menu(String s)//建立一个指定标题s的菜单。
public void add(MenuItem item)//向菜单添加菜单项item。
public void add(String s)//向菜单增加指定的选项。
public MenuItem getItem(int n)//得到指定索引处的菜单项。
public int getItemCount()//得到菜单选项数目。
public void insert(MenuItem item,int n)//在菜单的指定位置插入菜单选项。
public void insert(String s,int n)//在菜单指定位置插入菜单选项。
public void remove(int n)//删除菜单指定位置的菜单选项。
public void removeAll()//删除菜单的所有选项。
3.菜单项
MenuItem()//构造无标题菜单项。
MenuItem(String s)//构造有标题菜单项。
public void setEnabled(boolean b)//设置当前菜单项是否可被选择。
public String getlabel()//得到菜单选项的名字。
public void addActionListener(ActionListener)//向菜单项增加监视器,从菜单项接收行动事件(单击菜单项)。
4.菜单项上的ActionEvent事件
单击某个菜单项可以发生ActionEvent事件。
5.有关菜单的几个技巧
增加菜单分割线
假设menu1是Menu的一个实例,增加分割线的方法:
menu1.add("新建");
menu1.addSeparator(); //分割线
menu1.add("保存");
复选框菜单项
item1=new CheckboxMenuItem("新建");
嵌入子菜单
Menu是MenuItem的子类,因此菜单项本身还可以是一个菜单。
设置菜单项的快捷键
MenuShortcut(int key); //key取值KeyEvent.VK_A至KeyEvent.VK_Z,也可以取a至z。
Graphics类:
public Graphics getGraphics()//为组件创建一个图形上下文。如果组件当前是不可显示的,则此方法返回 null
。
Graphics类提供了在组件上绘制图形,打印文字和显示图像等操作的方法。new Font(null, Font.ITALIC|Font.BOLD, 30); 中的Font.ITALIC|Font.BOLD表示字体的样式是斜体和加粗效果。//1:这里没有重写paint()方法实现重绘,所以需要while(!g.drawImage(img, 0, 0, frame));来画出图像
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
public class ImageDraw extends Frame{
public ImageDraw() {
setSize(500, 500);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ImageDraw imgD = new ImageDraw();
Image img = imgD.getToolkit().getImage("caidai.jpg");
Graphics g = imgD.getGraphics();
while(!g.drawImage(img, 0, 0, imgD));
}
}
//2:这里重写了paint()方法实现重绘,在paint方法里面使用g.drawImage(img, 0, 0, this)即可画出图像。
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
public class ImageDraw extends Frame{
public ImageDraw() {
setSize(500, 500);
setVisible(true);
}
public void paint(Graphics g) {
Image img = getToolkit().getImage("caidai.jpg");
g.drawImage(img, 0, 0, this);
}
public static void main(String[] args) {
ImageDraw imgD = new ImageDraw();
}
}
2 利用Graphics绘制一些常用图形的方法:
import java.awt.*;
import java.applet.*;
public class DrawLine extends Applet {
public void paint(Graphics g) {
// 从点(0,0)到点(400,400)之间画直线
g.drawLine(0, 0, 400, 400);
// 从点(0,400)到点(400,0)之间画直线
g.drawLine(0, 400, 400, 0);
}
}
import java.awt.*;
import java.applet.*;
public class DrawRect extends Applet {
public void paint(Graphics g) {
g.drawRect(20, 20, 100, 160);
g.fillRect(200, 20, 100, 160);
}
}
import java.awt.*;
import java.applet.*;
public class DrawEllipse extends Applet {
public void paint(Graphics g) {
// 在原点为(10,10),半径为50画圆
g.drawOval(10, 10, 50, 50);
// 在原点为(100,10),半径为50画填充效果的圆
g.fillOval(100, 10, 50, 50);
// 在原点为(190,10),长轴为75,短轴为50画的椭圆
g.drawOval(190, 10, 90, 30);
// 在原点为(70,90),长轴为140,短轴为100画填充效果的椭圆
g.fillOval(70, 90, 140, 100);
}
}