JavaGUI

概念 

    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); //获取组件的前景色</span>

   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();

 组件的大小与位置

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事件相关的字符串命令,默认的字符串命令是按钮上的名称。</span>
    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()//将此复选框的状态设置为指定状态。</span>
      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)//删除文本框上的动作监视器。</span>
    文本框监视器处理事件的接口方法:

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<KeyEvent.vk_9)){
      System.out.println(code+"...是非法的");
       e.consum
}
}

});
菜单:

     继承关系:

      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("保存");</span>
 
 

   复选框菜单项

item1=new CheckboxMenuItem("新建");     

   嵌入子菜单

  Menu是MenuItem的子类,因此菜单项本身还可以是一个菜单。

  设置菜单项的快捷键

MenuShortcut(int key);  //key取值KeyEvent.VK_A至KeyEvent.VK_Z,也可以取a至z。</span>
Graphics类:
    1 获取Graphics类对象及Graphics的应用:
public Graphics getGraphics()//为组件创建一个图形上下文。如果组件当前是不可显示的,则此方法返回 <code>null</code>。 
Graphics类提供了在组件上绘制图形,打印文字和显示图像等操作的方法。new Font(null, Font.ITALIC|Font.BOLD, 30); 中的Font.ITALIC|Font.BOLD表示字体的样式是斜体和加粗效果。
   窗口的重绘:其实一个窗口在最小化以后,这个窗口在显存中已经消失,只是在内存中保存了窗口本身相关的参数,在还原窗口的时候,是根据内存的数据把窗口重新画出来,但是窗口表面用Graphics类所绘画的东西不会重新绘出来。这个过程称之为曝光。窗口每次被重绘以后,AWT线程会调用组件的paint(Graphics g)方法。
   AWT线程对组件重绘的调用过程:当曝光(窗口改变大小,程序需要在显卡中重新绘制窗口)的时候,AWT线程会调用组件的paint(Graphics g)方法(paint(Graphics g)方法是由AWT线程调度和管理的,我们不应该在程序中直接调用paint(Graphics g)方法。)
   如果我们想让窗口的内容刷新,我们可以调用repaint()方法,repaint()会自动调用组件的update()方法,update()方法会清除组件表面内容,然后调用paint(Graphics g)方法。使用Component对象.getToolkit().getImage(String path)语句可以获得Image实例对象。创建Image类对象的时候,并没有真正的在内存中创建图像数据,而是在需要的时候才去加载Image类对象所表示的图像数据。又因为drawImage方法是异步方法,也就是说图像还没加载完的时drawImage的方法已经返回了。所以我们要用如下的方法来画一幅图像:while(!g.drawImage(img, 0, 0, frame)); 这是一个空循环,直到drawImage返回true的时候就结束循环。
看如下例子:

//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));
 }
}


//<span style="font-family:SimSun;">2:这里重写了paint()方法实现重绘,在paint方法里面使用g.drawImage(img, 0, 0, this)即可画出图像。</span>
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绘制一些常用图形的方法:
1)画直线
void drawLine(int startX,int startY,int endX,int endY);
四个参数分别为:起始点的x坐标和y坐标以及终点的x坐标和y坐标,该方法用于在起点(startX,startY)和终点(endX,endY)之间画一条直线。
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);
}
}
2)画矩形
void drawRect(int x,int y,int width,int height);
绘制一个左上角坐标为(x,y),宽为width,高为height的直角矩形。
void fillRect(int x,int y,int width,int height);
绘制一个左上角坐标为(x,y),宽为width,高为height的有填充效果的直角矩形。
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);
}
}
3)画圆和椭圆
void drawOval(int x,int y,int width,int height);
void fillOval(int x,int y,int width,int height);
上述两种方法在坐标为(x,y)处,绘制或者填充一个长轴为width,短轴为height的椭圆。当长轴width与短轴height相等时,椭圆就变成了圆,所以JAVA并没有专门提供绘制圆的方法。
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);
	}
}










    

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值