Java GUI:AWT、Swing、UI绘制、双缓冲技术

来源:互联网 发布:win7引导ubuntu 编辑:程序博客网 时间:2024/06/10 07:43

GUIGraphical User Interface(图形用户接口)

GLICommand Line User Interface(命令行用户接口)就是常见的Dos命令行操作,需要记忆一些常见的命令,操作不直观

AWT

java.Awt:Abstract Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能,属重量级控件。


1. Component类

Java图形界面的基本组成是组件,组件是可以图形化显示在屏幕上与用户进行交互的对象。抽象类Component是所有GUI组件的父类,它定义了GUI组件的基本特性,实现了GUI组件的基本功能。Java程序要显示的组件必须是抽象类Componet(组件)或MenuComponent(菜单组件)的子类。


2. Canavs

Canavs是代表屏幕上一块空白矩形区域,程序可以在里面绘图,可以捕获用户的操作,产生相应事件。是最基本最简单的GUI功能的部件。Canavs需要更新时自动调用repaint方法,repaint方法也可以在程序中调用,repaint方法调用update方法,update方法调用paint方法.

要定制一个GUI功能的布局类,可以继承Canavs,上面已经完成了GUI的基本功能,我们只需在上面增加件子类部件特有的外观和相关代码就可以了,这就需要覆盖其paint方法。


3. Checkbox

Checkbox可以用来建立多选按钮和单选按钮。创建多选按钮用Checkbox(String label, boolean state)使用指定标签创建一个复选框,并将它设置为指定状态。参数label是选框旁边的说明文字,参数是决定选框是否被选中。创建单选按钮用Checkbox(String label, boolean state)使用指定标签创建一个复选框,并将它设置为指定状态。label - 此复选框的字符串标签,如果没有标签,则该参数为 null。state - 此复选框的初始状态。group - 此复选框的复选框组,如果没有这样的复选框组,则该参数为 null。


4. 菜单

MenuBar(菜单条),Menu(菜单),MenuItem(菜单项)。Menu本身是MenuItem的子类,一个Menu对象也可以作为一个菜单项添加到另外一个Menu对象上,这就是子菜单。

菜单制作过程:先生成MenuBar对象,再生成Menu对象,最后产生MenuItem对象,将MenuItem添加到Menu上后,再将Menu添加到MenuBar上,最后将MenuBar挂在Frame上。


5. Container类

组件不能独立的显示出来,必须放在一定的容器中才可以显示出来。Container是所有容器的父类。它又是Component的子类,所以容器也可以作为组件放在其他容器中。容器类可以用add()方法添加组件。

Container子类有Window和Panel。Window类没有边框和菜单条,其子类有Frame,Dialog,默认是用BorderLayout布局的。Panel子类有,默认用FlowLayout布局。


6. Dialog

Dialog一般是个临时的窗口,用于显示提示信息,或接收用户输入。对话框不能独立存在,必须有个上级窗口,可以是Frame框架。对话框有两种:模态对话框显示时,用户不能操作其他窗口,做到这个对话框被关闭。非模态对话框显示时,用户还可以操作其他窗口。对话框与框架Frame比较相似,可以添加组件在上面。


7. Panel类

面板Panel可以做容器加其他组件,但不能独立存在,需放在Window等其他容器中。Panel是一个空白容器类,提供容纳组件的空间,通常用于集成其他若干组件,使这些组件形成一个有机整体,再加到别的容器上。面板的设置布局管理器的SetLayout和添加组件的add方法最常用。


编程技巧:

未来构造一个复杂的布局,可以创建一个或多个面板,并定义它们各自的布局管理器,然后按照不同的布局组件加入到这些面板,最后按照一个总的布局来安排这些面板。程序的界面是非常重要的,如果可以增加特殊的面板及代码来改善程序的外观,应多努力。

界面中,一般按钮放在一行,并居中。一般将OK(或确定)按钮放在左边,取消(Cancel)按钮放在右边。如果菜单出现。

若程序中有菜单,则至少包含文件、编辑、帮助等子菜单,文件子菜单至少包含退出(Exit)选择,布局子菜单至少包括剪切(Cut)拷贝(Copy)和粘贴(Pate)等选项,帮助子菜单(Help)至少包含关于(About)选项等。


8. ScrollPane类

实现用于单个子组件的自动水平和/或垂直滚动的容器类。可以在小区域内看较多的内容。它的对象不能单独使用,必须放在其他容器中使用。

它本身是个容器,但只可以放一个组件,无布局管理器,要在上面放多个组件,只能在panel放多个组件,在把panel放在ScrollPane上

Container为容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来


9.布局管理器:容器中的组件的排放方式,就是布局

FlowLayout流式布局管理器:从左到右的顺序,Panel默认的布局管理器

BorderLayout边界布局管理器:东南西北中,Frame默认的布局管理器

GridLayout网格布局管理器:规则的矩阵

CardLayout卡片布局管理器:选项卡

GridBagLayout网格包布局管理器:非规则的矩阵

Frame f = new Frame("myframe");f.setSize(500,500);//设置窗体大小f.setLocation(1,1);//设置窗体在屏幕的位置f.setVisible(true);//让窗体显示Button b = new Button("haha");//创建一个组件---按钮f.add(b);//将按钮组件添加到窗体中f.setLayout(new FlowLayout());//设置窗体的布局

给窗体事件源添加一个窗体监听,监听一系列引发窗体事件的动作

将一个监听器对象作为参数传人

f.addWindowListener(new WindowAdapter(){    public void windowClosing(WindowEvent e){       System.exit(0);    }});

10.事件监听机制组成:

事件源(组件)  事件(Event) 监听器(Listener)  事件处理(引发事件后处理方式)

事件监听机制:

1) 确定事件源

2) 确定该事件源上可以注册的监听器

3) 明确要处理的监听器中的动作

事件监听机制中,事件源就是awt中的已有组件,事件源对应的能产生的事件对象也是固定的,而且,监听器也是固定的。在事件监听机制中,唯一可以自定义的就是事件处理方式,其实就是该引发事件的动作对应的函数的内容编写。

按钮上不能添加窗体监听


11.GUI组件上的图形操作:

1)绘图原理:

如果要在GUI组件上画图、打字、显示图像,组件本身没有这些方法,但通过一个getGraphics方法,该方法返回一个包含有该组件的屏幕显示外观信息的Graphics方法类的对象,Graphics中提供了组件显示表面绘画图形,打印文字,显示图像等操作方法。

Graphics类用于在一个可视组件内绘图。一个Graphics对象包含了绘图所必需包含的信息,其中包括坐标、色彩、字体和剪贴板区。绘图在一个二维整数坐标系中进行,该坐标的原点在组件的左上角,X轴在水平方向从左往右延伸,y轴垂直向下增长。Graphics对象不能被初始化,只可以从现有图形对象或使用Component的getGraphics方法得到。Graphics包含了大量方法,可查阅API文档了解其功能与用法。

Graphiucs是继承Object的抽象类,不能直接实例化,可以通过Component的getGraphics方法为组件创建一个图形上下文。如果组件当前是不可显示的,则此方法返回 null。所以使用前调用此方法画图的组件必须是可见的,也就必须调用的组件的setVisible(boolean b),参数设为true。把得到的Graphiucs对象赋值给Graphicus类型的变量。再调用Grahpicus中的构造绘图方法。

图形窗口显示打印的文字的语句不是System.out.println()语句,只有使用Graphics.drawString()语句才可以打印字符文本。并且这个方法的坐标是指文本块显示时的左下角位置。若用println方法打印的内容会在命令行或开发工具控制台窗口中显示。


2)组件重绘

用Graphics画的图形在刷新和窗口大小改变后,里面的内容就会丢失。要让组件里画的内容一直保持,就要在窗体改变,组件重新绘制后,将原来的图形重新画上去,让用户感觉里面的内容没有改变。

AWT线程在窗口初始显示(setVisible方法被执行)和重新绘制组件后,会立即调用组件的paint方法,重绘代码也就在paint方法中写。

paint方法的定义:public void paint(Graphics g)

要想paint中的代码被执行,需要用Component.repaint方法,Component.repaint方法调用Component.update方法,Component.update方法先清除组件表明的内容再调用Component.paint方法。所以窗口开始显示时AWT线程调用paint方法,之后窗口大小改变或最小最大化,或被其他窗口遮蔽又显现的时候,组件会重绘,会通过update方法调用paint方法。

paint方法已经在Component类中定义,所以要修改其代码,必须继承Component类或其子类,之后覆盖paint方法,在其中编写重绘图形程序代码,并将原先创建的子类类对象由这个类创建。


3)图像操作

Graphics类中有很多处理图像的方法,相关功能可以查看API。

通过public abstract boolean drawImage(Image img,int x,int y,Color bgcolor,ImageObserver observer) 方法可以在组件上显示图像。图像的左上角位于此图形上下文坐标空间的 (x, y)。img - 要绘制的指定图像。如果 img 为 null,则此方法不执行任何操作。所以要保证img不为null下调用,若保证不了,要设定条件语句,在img不为空时才执行。x - x 坐标。y - y 坐标。bgcolor - 在图像非透明部分下绘制的背景色。observer - 当转换了更多图像时要通知的对象。若要了解图像创建的进度信息,需要编写一个实现了ImageObserver接口的类,并将其对象传给drawIamge方法。若不关心,可以传递显示图像的那个组件对象,因为Component类实现了ImageObserver接口。

如何获取硬盘的一个图像显示在组件上:

在Java中,有关Image图像类,public abstract class Imageextends Object抽象类 Image 是表示图形图像的所有类的超类。不能直接创建实例对象。必须以特定于平台的方式获取图像。

在AWT包中有关抽象类Toolkit,此类是所有 Abstract Window Toolkit 实际实现的抽象超类。Toolkit 的子类被用于将各种组件绑定到特定本机工具包实现。大多数应用程序不应直接调用该类中的任何方法。Toolkit 定义的方法是一种“胶水”,将 java.awt 包中与平台无关的类与 java.awt.peer 中的对应物连接起来。Toolkit 定义的一些方法能直接查询本机操作系统。Tookit中的方法getImage(URL url)可以返回一幅图像,该图像从指定 URL 获取像素数据。

要得到图像,Toolkit也不能创建实例对象,所以寻到Component中的getTookit方法来获取此组件的工具包,返回Tookit对象,返回的对象调用getImage方法得到Image对象。若一个名为test的图片存在C盘,这最后框架f得到这个图像的语句为:Image img=f.getToolkit().getImage(“ c:\\tes.gif ”); 把f传给drawImage就可以显示图像了。


注意:

由于drawImage是Graphics的方法,而Graphics是抽象类,其对象通常由组件的getGraphics方法得到,而这个方法必须是调用它的组件是可以见才不为空。所以一定要让相关组件可见,drawImage的代码在设置组件可见之后。否则会产生空指针异常。

另外,当窗口初始或组件重绘时会调用paint方法,会擦掉先前画的内容。而drewIamge方法写在main方法中的话,无法确定AWT线程何时启动,可能后于main方法中的代码启动,这样画出的内容就会被擦掉。所以要把画图的drawImage方法写在paint方法中,paint方法是Component的方法,所以要继承Component或其子类,覆盖paint方法才能更改。

还有就是,getImage若没有被执行,drawImage参数找不到图像,也会空指针异常,所以一定要保证调用drawIamge前执行了getImage。drawImage放在paint方法中,paint方法在组件显示前是不会调用的,所以只要把getImage方法写在设置组件可见的setVisible前就可以了。


4)双缓冲技术

组件重绘在图形很多很复杂时,要重绘的就非常多,写得代码也很繁琐。Java的Component类提供了一个createImage方法,可以在内存中创建一个Image对象,当我们在组件上绘图时,这个Image对象上执行完全相同的绘制,当组件重画时,只需将内存中的这个Image对象在组件上画出,不管组件上原来有多少图形,这就是双缓冲技术。

方法定义:public Image createImage(int width,int height)

创建一幅用于双缓冲的、可在屏幕外绘制的图像。width - 指定的宽度,height - 指定的高度。一幅屏幕外可绘制的图像,可用于双缓冲。如果组件是不可显示的,则返回值可能为 null。所以部件能显示出后才可以调用。此方法得到的Image对象调用getGraphics得到的Graphics对象绘制窗口中Graphics对象做的绘制的所有图形,之后在paint方法用drawImage方法中绘制createImage绘制的图像。

使用步骤(变量名可以改):

定义一个Dimension 变量dim,调用其getSize方法获得组件大小(Dimension 类封装单个对象中组件的宽度和高度(精确到整数)。)

定义一个Image变量img,把dim的width、height传给createImage方法,将createImage方法执行结果赋值img

定义一个绘图Graphics变量gra,用img调用getGraphics,把结果传给gra。

在监听器的相关方法中用gra执行组件中设的Graphics变量画图操作的所有代码(组件中画什么,gra就画什么),画出一模一样的图像自动保存的内存中,也就是图像img。

在paint中用组件中的Graphics变量调用drawImage方法,绘制出gra画的图像img。就得到组件重绘的效果了。


Swing

Swing为GUI提供了更完整的组件和功能。Swing组件放在javax.swing包中,都是Jcomkponent的之类。增强的组件在Swing中的名字都是在AWT组件名字前加上一个字母“J”,如Swing中按钮为JButton。

JFC(java Foundation Class),集合了Swing组件和其他能简化开发的API类。


1. JRootPane

是awt.Container和JComponent的子类,该轻量级容器由 JFrame、JDialog、JWindow、JApplet 和 JInternalFrame 在后台使用。

“重量级”组件是指委托给主机系统上的同位体或本地组件的组件,一般用较暗的、更重的框来显示。

四个重量级 JFC/Swing 容器是:JFrame、JDialog、JWindow 和 JApplet。另外还有一个轻量级容器 JInternalFrame。所有这五个 JFC/Swing 容器都实现 RootPaneContainer 接口,并且它们都将其操作委托给 JRootPane(顶端显示有一个小 "handle")。即为了便于使用 JFrame、JDialog、JWindow、JApplet 和 JInternalFrame,默认情况下,将 add、remove 和 setLayout 方法的所有调用转发到 contentPane。调用他们继承的getContentPane()方法可以获得自己的内部块contentpane,即得到JRootPane。用这个对象做委托给它的相关操作(比如用add方法加组件和设置布局管理器等)。


2.JFrame

Swing中的JFrame是Frame的子类,功能相当,但JFrame上只能有一个唯一的组件,就是JRootPane。

添加组件: 应用程序不能像Frame那样直接用JFrame对象调用add方法添加组件和和设置布局管理器。必须用JFrame的后台用的JRootPane对象增加组件和设置布局管理器:

JFrame对象可以调用JFreme.getContentPane()方法可以获得JFrame中内置的JRootPane对象。

用得到的JRootPane对象调用add方法添加组件和设置布局管理器。

关闭窗口:JFrame的窗口即使点了关闭按钮,只是自动隐藏JFrame窗口,实际还在内存中运行。所以用如下方法让点击关闭按钮时真正关闭窗口:

在windowClosing事件处理方法中,调用这个窗口对象的dispose方法类关闭。

调用setDefaultCloseOperation方法:将JFrame.EXIT_ON_CLOSE它作为参数传给这个方法。EXIT_ON_CLOSE是JFrame定义的常量,表示使用 System exit 方法退出应用程序。


3.JScrollPane

Swing中的滚动条窗口JScrollPane同样与AWT中ScrollPane功能相当,让有限区域可以阅读或输入更多内容。只是用法有别。

用法:

JScrollPane可以生成垂直和水平的滚动条,它由JScrollBar(滚动条)和JViewport(用于查看底层信息的“视口”或“观察孔”,滚动条中间的视图区域)组成。

用JScrollPane.getViewport方法可以返回视图区域的JViewport对象。

这个对象可以调用JViewport.setView方法添加文本区域等要显示的内容组件。

最后将JScrollPane作为组件条件到相应的容器中。


4.对话框 

对话框用于提示用户发生了什么事情,或要求用户确认或取消某个动作。

Swing中可以使用JDialog类和JOptionPane类创建对话框。

JOptionPane 有助于方便地弹出要求用户提供值或向其发出通知的标准对话框。其中有很多showXxxDialog的静态方法来参数标准的对话框。可以直接用类名调用,Xxx为各种名称。

   


5.BoxLayout布局管理器

这是Swing中新增的布局管理器,可以允许许多组件全部垂直摆放或全部水平摆放。嵌套组合多个使用BoxLayout布局管理器的Panel可以实现GridBagLayout的功能。



原创粉丝点击