Java笔记 - GUI编程

一、图形界面开发

1、AWT开发

     AWT(Abstract Window Toolkit)在Windows、Linux提供的图形窗口之上,再次进行了抽象,为不同语言开发的程序提供统一定义的图形接口,可以实现JAVA跨平台的GUI(Graphics User Interface)图形用户界面编程,但由于AWT又应用了操作系统特有的东西,而每个系统对其实现不同,不能做到完全的跨平台。AWT所涉及的类包含于java.awt包及其子包中,Container和Component是AWT中的两个核心类。


          image

       Component类及其子类的对象,用来描述以图像化的方式显示在屏幕上,并能与用户进行交互的GUI元素,例如:按钮、文本框、标签等。Container是Component的子类,一般的Component对象(非Frame)不能独立的显示出来,必须要添加到某一个Container对象中才能显示出来,可以使用Container子类对象的add()方法向其中添加别的Component对象(包含Container对象)。   

2、Swing开发

二、组件和容器

       常见的Container有Windows和Panel。Window对象表示自由停泊的顶级窗口,Panel对象可以作为容纳其他Component的对象,但不能独立存在,必须被添加到Windows或Applet中。

1、Frame

     Frame是window的子类,可以通过Frame 或 继承Frame 来创建一个窗体,建议使用继承的方式,这样自定义窗口属性和方法。

  1 import java.awt.*;
  2 
  3 public class Main {
  4     public static void main(String args[]) {
  5         //调用构造方法,设置窗体标题为 str
  6         //或用setTitle(String name)设置标题
  7         //或用getTitle(String name)获取标题 	    	
  8         Frame frame =   new Frame("HelloWord");
  9 
 10         //设置窗体位置和大小
 11         //setLocation(int x,int y)设置窗体位置,x,y为左上角上标
 12         //和setSize(int width,int height)设置窗体的大小
 13         frame.setBounds(400,300,800,600);
 14 
 15         //设置背景颜色,参数为Color对象
 16         //也可使用三原色 建立Color对象,new Color(204,204,255)
 17         frame.setBackground(Color.BLUE);
 18         //不带自己的布局管理器
 19         frame.setLayout(null);
 20         //设置是否可见
 21         frame.setVisible(true);
 22         //设置是否可以调整大小
 23         frame.setResizable(false);
 24     }
 25 }

2、Panel

     Panel对象用于容纳Component的对象,可在构造方法中可以初始化布局管理器。

  1 import java.awt.*;
  2 public class Main {
  3      public static void main(String args[]) {
  4         Frame f = new Frame("Panel");
  5         f.setLayout(null);
  6         f.setBounds(300,300,500,500);
  7         f.setBackground(new Color(0,0,102));
  8 
  9         //Panel()使用默认的FlowLayout类布局管理初始化
 10         //Panel(LayoutManager layout)使用指定的布局管理器初始化
 11         //也可使用setLayout(LayoutManager layout)设置
 12         Panel p = new Panel(null);
 13 
 14         //设置窗体位置和大小
 15         //setLocation(int x,int y)设置窗体位置,x,y为左上角上标
 16         //和setSize(int width,int height)设置窗体的大小
 17         p.setBounds(50,50,400,400);
 18 
 19         //设置背景颜色,参数为Color对象
 20         p.setBackground(new Color(204,204,255));
 21 
 22         //将面板添加到窗体中显示
 23         f.add(p);
 24         f.setVisible(true);
 25     }
 26 }
 27 

3、Button

  1 import java.awt.*;
  2 public class Main{
  3     public static void main(String args[]){
  4 		Frame f = new Frame("Java Gui");
  5 		f.setLayout(null);
  6 		f.setBounds(300,300,500,500);
  7 
  8 		//创建Button元素
  9 		Button b = new Button("Button1");
 10 		b.setLocation(47,70);
 11 		b.setSize(60,25);
 12 
 13 		f.add(b);
 14 		f.setVisible(true);
 15 	}
 16 }

4、TextField

      TextField可以用来创建文本框对象。

  1 import java.awt.*;
  2 public class Main {
  3 	public static void main(String[] args) {
  4 		TextField num1, num2, num3;
  5 		Frame frame = new Frame();
  6 		//输入框		
  7 		num1 = new TextField("Hello");
  8 		num2 = new TextField("大家好",15);
  9 		num3 = new TextField(10);
 10 
 11 		//设置回显字符,多用于密码框
 12 		num1.setEchoChar('*');
 13 		num2.setEchoChar('#');
 14 		//若文本框可输入,则设置为不可输入
 15 		if(num1.isEditable()&&num1.isEditable()) {
 16 			num1.setEditable(false);
 17 			num2.setEditable(false);
 18 		}
 19 		//将num1和num2的值相加赋予num3
 20 		num3.setText(num1.getText()+num2.getText());
 21 		num3.setBackground(Color.red);
 22 
 23 		//设置布局,增加元素
 24 		frame.setLayout(new FlowLayout());
 25 		frame.add(num1);
 26 		frame.add(num2);
 27 		frame.add(num3);
 28 		frame.pack();
 29 
 30 		frame.setBounds(300,300,500,200);
 31 		frame.setVisible(true);
 32 	}
 33 }

5、Graphics

      每一个Component都有一个paint(Graphics  g)用于实现绘图,当刷新、重现、repaint时都会重画,每次重画时都自动调用paint方法。

  1 import java.awt.*;
  2 
  3 public class Main {
  4 	public static void main(String[] args) {
  5 		new PaintFrame().launchFrame();
  6 	}
  7 }
  8 
  9 class PaintFrame extends Frame {
 10 
 11 	public void launchFrame() {
 12 		setBounds(200,200,640,480);
 13 		setVisible(true);
 14 	}
 15 
 16 	//每次需要重画的时候,调用paint方法
 17 	public void paint(Graphics g) {
 18 		Color c = g.getColor();
 19 		g.setColor(Color.red);
 20 		g.fillOval(50, 50, 30, 30);
 21 		g.setColor(Color.green);
 22 		g.fillRect(80,80,40,40);
 23 		//重置画笔为原来的颜色
 24 		g.setColor(c);
 25 	}
 26 }

三、布局管理器

       每一个Container都有一个布局管理器对象,可以自动管理Component在Container中的布局,当容器需要对某个元素进行定位或判断其尺寸大小时,就会调用其对于的布局管理器(应用了多态,所以的布局管理器都实现了LayoutManager 接口。

      程序员直接设置Component的位置和大小将会被覆盖,可以通过Container的setLayout方法重写设置其布局管理器对象,若不想使用则需将容器的布局管理器设置为null。

1、FlowLayout

      FlowLayout是Panel的默认布局管理器,FlowLayout布局管理器队组建逐行进行定位,行内从左到右,一行排满后换行。不改变组件的大小、按组件原有的尺寸显示组件,可以设置不同的组件间距、行距和对齐方式,默认的对齐方式是居中对齐。

  1 import java.awt.*;
  2 public class Main {
  3     public static void main(String args[]) {
  4 	    Frame f = new Frame("Flow Layout");
  5 	    f.setBounds(300,300,500,500);
  6 	    f.setBackground(new Color(204,204,255));
  7 
  8         //设置居中对齐方式、水平间距20像素、垂直间距40像素,缺省值都为5
  9         f.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 40));
 10 
 11         //布局管理器会自动对加入的元素进行布局
 12         for(int i = 1; i<=20; i++){
 13             f.add(new Button("BUTTON"));
 14         }
 15         //建议最后在设置Visable属性,否则可能会使部分元素无法正常显示
 16         f.setVisible(true);
 17     }
 18 }

2、BorderLayout

      BorderLayout是Frame的默认布局管理器,BorderLayout将整个容器划分为东西南北中五个区域,组件只能被添加到指定的区域中;每个区域只能加入一个组件,如果加入多个,则先前加入的会被覆盖;若不指定组件加入的区域,则默认加入center区。

      BorderLayout型布局管理器尺寸缩放原则:北南两个区域在水平方向缩放、东南两区域在垂直方向缩放、中部可在两个方向上缩放。

  1 import java.awt.*;
  2 public class Main {
  3 	public static void main(String args[]) {
  4 		Frame f = new Frame("Border Layout");
  5 		f.setBounds(300,300,500,500);
  6 
  7 		Button bn = new Button("BN");
  8 		Button bs = new Button("BS");
  9 		Button bw = new Button("BW");
 10 		Button be = new Button("BE");
 11 		Button bc = new Button("BC");
 12 
 13 		//也可使用"North"、"South"、"West"、"East"、"Center"表示
 14 		f.add(bn, BorderLayout.NORTH);
 15 		f.add(bs, BorderLayout.SOUTH);
 16 		f.add(bw, BorderLayout.WEST);
 17 		f.add(be, BorderLayout.EAST);
 18 		f.add(bc, BorderLayout.CENTER);
 19 
 20 		f.setVisible(true);
 21 	}
 22 }
 23 

3、GridLayout  

      GridLayout型布局管理器,将空间划分为规则的矩形网格,每个单元格区域大小相等,组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下。

  1 import java.awt.*;
  2 public class Main {
  3   public static void main(String args[]) {
  4     Frame f = new Frame("Java Frame");
  5     f.setBounds(300,300,500,500);
  6     f.setBackground(new Color(204,204,255));
  7 
  8     //设置Frame布局管理器
  9     //指定分割的行数和列数
 10     f.setLayout(new GridLayout(2,1));
 11 
 12     //p1面板
 13     Panel p1 = new Panel(new BorderLayout());
 14     Panel p11 = new Panel(new GridLayout(2,1));
 15     //添加p11元素
 16     p11.add(new Button("BUTTON"));
 17     p11.add(new Button("BUTTON"));
 18     //添加p1元素
 19     p1.add(new Button("BUTTON"),BorderLayout.WEST);
 20     p1.add(new Button("BUTTON"),BorderLayout.EAST);
 21     p1.add(p11,BorderLayout.CENTER);
 22 
 23     //p2面板
 24     Panel p2 = new Panel(new BorderLayout());
 25     Panel p21 = new Panel(new GridLayout(2,2));
 26     //添加p21元素
 27     for(int i =1;i<=4;i++) {
 28     	p21.add(new Button("BUTTON"));
 29     }
 30     //添加p2元素
 31     p2.add(new Button("BUTTON"),BorderLayout.WEST);
 32     p2.add(new Button("BUTTON"),BorderLayout.EAST);
 33     p2.add(p21,BorderLayout.CENTER);
 34 
 35     //Frame添加p1和p2
 36     f.add(p1);
 37     f.add(p2);
 38     //调整此窗口的大小,以适合其子组件的首选大小和布局
 39     //若不写,组件会按照Grid/Board缩放原则进行缩放,来适应窗口大小(默认为全屏)
 40     //f.pack();
 41     f.setVisible(true);
 42   }
 43 }
 44 

四、事件监听与处理

                image

       使用addActionListener(ActionListener L)方法为事件源对象注册一个ActionListener对象,当事件源对象发生Action事件时,会自动生成一个ActionEvent对象,并将该对象作为参数传递给ActionListener对象的actionPerformed方法,在该方法在获取对象信息进行处理,如:getSource方法可以获取组件对象。其他类型事件如windowEvent、MouseEvent、KeyEvent同理。

      建议使用Adapter作为事件的监听器,使用适配器可以避免监听器定义没有必要的空方法。抽象类Adapter已经实现了Listener接口,并为不同的事件做了空实现。对于不同类型的监听器,对应不同的适配器。

1、按钮事件

  1 import java.awt.*;
  2 import java.awt.event.*;
  3 public class Main {
  4     public static void main(String args[]) {
  5 		Frame f = new Frame("Test");
  6 		f.setLocation(300,300);
  7 
  8 		//事件源对象
  9 		//也可使用setActionCommand设置发生事件的button名,用于区别按钮
 10 		Button b1 = new Button("Start");
 11 		Button b2 = new Button("Stop");
 12 
 13 		//创建监听器对象
 14 		Monitor bh = new Monitor();
 15 
 16 		//监听器在事件源对象进行注册
 17 		b1.addActionListener(bh);
 18 		b2.addActionListener(bh);
 19 
 20 		f.add(b1,"North");
 21 		f.add(b2,"Center");
 22 		f.pack();
 23 		f.setVisible(true);
 24     }
 25 }
 26 //监听ActionEvent
 27 class Monitor implements ActionListener {
 28 	//接到某件事件后对其进行处理。该方法由 组件 对象多态调用
 29     public void actionPerformed(ActionEvent e) {
 30     	System.out.println("a button has been pressed," +
 31     	"the relative info is:\n " + e.getActionCommand());
 32 	}
 33 }

2、文本事件

  1 import java.awt.*;
  2 import java.awt.event.*;
  3 
  4 public class Main {
  5 	public static void main(String[] args) {
  6 		new TestFrame().launchFrame();
  7 	}
  8 }
  9 
 10 class TestFrame extends Frame {
 11 	TextField num1, num2, num3;
 12 	public void launchFrame() {
 13 		//输入框
 14 		num1 = new TextField(10);
 15 		num2 = new TextField(10);
 16 		num3 = new TextField(15);
 17 		//标签
 18 		Label lblPlus = new Label("+");
 19 		Button btnEqual = new Button("=");
 20 
 21 		//注册监听器
 22 		btnEqual.addActionListener(new MyMonitor());
 23 
 24 		//设置布局,增加元素
 25 		setLayout(new FlowLayout());
 26 		add(num1);add(lblPlus);
 27 		add(num2);add(btnEqual);
 28 		add(num3);
 29 		pack();
 30 		setVisible(true);
 31 	}
 32 	//内部类,监听器
 33 	private class MyMonitor implements ActionListener  {
 34 		public void actionPerformed(ActionEvent e) {
 35 			int n1 = Integer.parseInt(num1.getText());
 36 			int n2 = Integer.parseInt(num2.getText());
 37 			num3.setText("" + (n1+n2));
 38 		}
 39 	}
 40 
 41 }

3、Windows事件

      Window事件对应的事件类为WindowEvent,对应的事件监听接口为WindowListener、对应的适配器为WindowAdapter。

  1 import java.awt.*;
  2 import java.awt.event.*;
  3 public class Main {
  4   public static void main(String args[]) {
  5     new MyFrame("MyFrame");
  6   }
  7 }
  8 class MyFrame extends Frame {
  9 	MyFrame(String s) {
 10     super(s);
 11     setLayout(null);
 12     setBounds(300, 300, 400, 300);
 13     this.setBackground(new Color(204, 204, 255));
 14     setVisible(true);
 15     this.addWindowListener(new MyWindowMonitor());
 16   }
 17 
 18   class MyWindowMonitor extends WindowAdapter {
 19   	public void windowClosing(WindowEvent e) {
 20   		setVisible(false);
 21   		System.exit(0);
 22   	}
 23   }
 24 }
 25 

4、鼠标事件

  1 import java.awt.*;
  2 import java.awt.event.*;
  3 import java.util.*;
  4 public class Main{
  5   public static void main(String args[]) {
  6     new MyFrame("drawing...");
  7   }
  8 }
  9 
 10 class MyFrame extends Frame {
 11   ArrayList<Point> points = null;
 12   MyFrame(String s) {
 13     super(s);
 14     points = new ArrayList<Point>();
 15     setLayout(null);
 16     setBounds(300,300,400,300);
 17     this.setBackground(new Color(204,204,255));
 18     setVisible(true);
 19     this.addMouseListener(new Monitor());
 20 	}
 21 
 22 	public void paint(Graphics g) {
 23     Iterator<Point> i = points.iterator();
 24     while(i.hasNext()){
 25       Point p = i.next();
 26       g.setColor(Color.BLUE);
 27       g.fillOval(p.x,p.y,10,10);
 28     }
 29   }
 30 
 31   public void addPoint(Point p){
 32     points.add(p);
 33   }
 34 }
 35 class Monitor extends MouseAdapter {
 36   public void mousePressed(MouseEvent e) {
 37 	  MyFrame f = (MyFrame)e.getSource();
 38     f.addPoint(new Point(e.getX(),e.getY()));
 39 	//双缓冲:repaint - update - paint
 40     f.repaint();
 41   }
 42 }

5、键盘事件

  1 import java.awt.*;
  2 import java.awt.event.*;
  3 
  4 public class Main {
  5 	public static void main(String[] args) {
  6 		new KeyFrame().launchFrame();
  7 	}
  8 }
  9 
 10 class KeyFrame extends Frame {
 11 	public void launchFrame() {
 12 		setSize(200, 200);
 13 		setLocation(300,300);
 14 		addKeyListener(new MyKeyMonitor());
 15 		setVisible(true);
 16 	}
 17 
 18 	class MyKeyMonitor extends KeyAdapter {
 19 		public void keyPressed(KeyEvent e) {
 20 			int keyCode = e.getKeyCode();
 21 			if(keyCode == KeyEvent.VK_UP) {
 22 				System.out.println("UP");
 23 			}
 24 		}
 25 	}
 26 }
 27 
posted @ 2018-01-19 11:46  苏贺  阅读(327)  评论(0编辑  收藏  举报