2021年3月7日15点59分 JAVA自学课程笔记9: GUI(Graphical User Interface):图形用户界面 组件(Component): 组件是图形用户界面的基本组成元素,凡是能够以图形化方式显示在屏幕上并能够与用户进行交互的对象均为组件,如菜单、按钮、标签、文本框、滚动条等。 组件分类: java.awt.Component java.awt.MenuComponent(目前用不到) 说明:抽象类java.awt.Component是除菜单相关组件之外所有Java AWT组件类的根父类,该类规定了GUI组件的基本特性,如尺寸、位置和颜色效果等,并实现了作为一个GUI部件所应具备的基本功能。 容器: 组件通常不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。 有一类特殊的组件是专门用来包含(存放)其他组件的,这类组件就叫做容器,java.awt.Container 是所有容器的父类,java.awt.Container继承自java.awt.Component。 容器类对象本身也是一个组件,具有组件的所有性质,但反过来组件却不一定是容器。 Frame常用方法: public void setBounds(int x, int y, int width, int height) 设置窗体的位置和大小,x和y表示窗体左上角距离屏幕的水平和垂直距离,with和height是窗体本身的宽度和高度。 public void setSize(int width, int height) 设置窗体的大小,with和height 是窗体本身的宽度和高度。 public void setVisible(boolean flag) 设置窗体是否可见,true表示可见,false表示不可见。 public void setBackground(Color c) 设置窗体的背景色。 移动闪动窗口: Test1: import java.awt.*; public class test1{ public static void main(String[] args){ Frame f = new Frame(); f.setTitle("Yellow"); f.setSize(900, 900); f.setBackground(Color.YELLOW); f.setVisible(true); try{ Thread.sleep(200); }catch(InterruptedException e){} f.setLocation(200, 200); try{ Thread.sleep(200); }catch(InterruptedException e){} f.setVisible(false); } } Panel: panel是容纳其他组件的组件(即容器),但不能单独存在,必须得被添加到其他容器中。 即“f.add(p);”。 当Panel添加进其他容器中后,Panel任然可以有自己的布局管理器。 布局管理器: 容器对其中所包含组件的排列方式,包括组件的位置和大小设定,被称为容器的布局(Layout)。 为了使图形用户界面具有良好的平台无关性,Java语言提供了布局管理器来管理容器的布局,而不建议直接设置组件在容器中的位置和尺寸。 每个容器都有一个默认的布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会自动调用其对应的布局管理器。使用布局管理器时,布局管理器负责各个组件的大小和位置,因此用户*无法在这种情况下设置组件大小和位置属性,如果试图使用Java语言提供setLocation(),setSize(),setBounds()等方法,则都会被布局管理器*覆盖。 如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:“setLayout(null)”。 在AWT中,常见的布局管理器: BorderLayout(Frame的默认布局管理器)(边缘摆放) FlowLayout(Panel的默认布局管理器)(流式摆放) GridLayout (格子摆放) FlowLayout布局管理器: FlowLayout是Panel类的默认布局管理器。 FlowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行。 不改变组件的大小,按组件原有尺寸显示组件,可设置不同的组件间距,行距以及对齐方式。 FlowLayout布局管理器默认的对齐方式是*居中。 new FlowLayout(FlowLayout.RIGHT, 20, 40); 右对齐,组件之间水平间距20个像素,垂直间距40个像素。 new FlowLayout(FlowLayout.LEFT); 左对齐,水平和垂直间距为缺省值(默认5)。 new FlowLayout(); 使用缺省居中方式对齐,水平和垂直间距为缺省值(默认5)。 若有一Frame对象f,已知Frame的默认布局管理器是BorderLayout,欲重置其布局管理器则可以用“f.setLayout(new FlowLayout(FlowLayout.CENTER));”。 BorderLayout布局管理器: BorderLayout将整个容器的布局划分成东(EAST),西(WEST),南(SOUTH),北(NORTH),中(CENTER)五个区域,组件只能被添加到指定的区域。 如不指定组件的加入部位,则默认加入到CENTER区。 每个区域只能加入一个组件,如加入多个,则先前加入的会被覆盖。 GridLayout布局管理器: GridLayout型布局管理器将空间划分成规则的矩形网格,每个单元格区域大小相等。组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下。 在GridLayout构造方法中指定分割的行数和列数: GridLayout(3, 4) //能将Frame分为等边的3*4个格子分别存放组件。 事件处理相关概念: 事件(Event): 用户对组件的一个操作,叫做一个事件。 事件源(Event Source): 能够产生事件的GUI组件*对象,如按钮、文本。 事件处理方法(Event Handler): 能够接收、解析和处理事件类对象,实现与用户交互功能的方法。 事件监听器(Event Listener): 可以处理事件的一个*类。 Test1: import java.awt.*; import java.awt.event.*; public class Test1{ public static void main(String[] args){ Frame f = new Frame(); Button bn = new Button("OK"); f.add(bn); A aa = new A(); B bb = new B(); bn.addActionListener(aa); //向bn按钮添加了一个鼠标单击的监听器。 f.pack(); //调整此窗口的大小,以适合其子组件的首选大小和布局。 f.addWindowListener(bb); f.setVisible(true); } } class A implements ActionListener{ public void actionPerformed(ActionEvent e){ System.out.println("OK"); } } class B extends WindowAdapter{ //没有用“implements WindowListener”是因为实现一个抽象类需要把该抽象类中的所有抽象方法都实现。 public void windowClosing(WindowEvent e){ System.exit(-1); } } //运行结果: (按下按钮“OK”可以打印出OK。) (按下右上角的“×”可以关闭程序。) 事件处理步骤: 假设发生事件XXXX(例如为Action)。 1.向事件源注册某种事件的事件监听器对象。 事件源.add.XXXXListener(监听器对象); 2.设计好可以处理这种事件的监听器。 class 监听器类名 implements XXXXListener{ //重写XXXXListener接口中的方法。 } (即向事件源注册某种事件的事件监听器对象、设计好该监听器就能处理事件了。) java.awt.event包中含有所有的事件,常用的事件有: ActionEvent:激活组件时发生的事件。 KeyEvent:操作键盘时发生的事件。 MouseEvent:操作鼠标时发生的事件。 WindowEvent:操作窗口时发生的事件,如最大化和最小化、关闭某一窗口。 Test2: import java.awt.*; public class TestGUI{ public static void main(String[] args){ Frame f = new Frame(); f.setSize(300, 300); f.setLayout(new GridLayout(2, 1)); Panel p1 = new Panel(); p1.setLayout(new BorderLayout()); //因为Panel默认的是FlowLayout布局管理器 Panel p1_1 = new Panel(); p1_1.setLayout(new GridLayout(2, 1)); Button bn1 = new Button("BUTTON1"); Button bn2 = new Button("BUTTON2"); Button bn3 = new Button("BUTTON3"); Button bn4 = new Button("BUTTON4"); p1.add(bn1, BorderLayout.WEST); p1.add(p1_1); p1_1.add(bn2); p1_1.add(bn3); p1.add(bn4, BorderLayout.EAST); f.add(p1); f.pack(); f.setVisible(true); //第一行的四个按钮制作完成。 Panel p2 = new Panel(); p2.setLayout(new BorderLayout()); Panel p2_2 = new Panel(); p2_2.setLayout(new GridLayout(2, 2)); Button bn5 = new Button("BUTTON5"); Button bn6 = new Button("BUTTON6"); Button bn7 = new Button("BUTTON7"); Button bn8 = new Button("BUTTON8"); Button bn9 = new Button("BUTTON9"); Button bn10 = new Button("BUTTON10"); p2.add(bn5, BorderLayout.WEST); p2.add(p2_2); p2_2.add(bn6); p2_2.add(bn7); p2_2.add(bn8); p2_2.add(bn9); p2.add(bn10, BorderLayout.EAST); f.add(p2); f.pack(); //第二行的六个按钮制作完成。 } }