本节要点:
1.Java图形界面编程
2.AWT、布局管理器、事件模型,
3.JFC、Swing编程。应用JBuilder快速开发图形界面程序部分略去。
详细内容:
1.AWT(Abstract Window Toolkit)
AWT抽象窗口工具包,SUN公司提供的用于图形界面编程(GUI)的类库。基本的AWT库处理用户界面元素的方法是把这些元素的创建和行为委托给每个目标平台上(Windows、Unix、Macintosh等)的本地GUI工具进行处理。例如:如果我们使用AWT在一个Java窗口中放置一个按钮,那么实际上使用的是一个具有本地外观和感觉的按钮。这样,从理论上来说,我们所编写的图形界面程序能运行在任何平台上,做到了图形界面程序的跨平台运行。
2.布局管理器
容器里组件的位置和大小是由布局管理器来决定的。容器对布局管理器的特定实例保持一个引用。当容器需要定位一个组件时,它将调用布局管理器来完成。当决定一个组件的大小时,也是如此。在AWT中,给我们提供了五种布局管理器:BorderLayou、 FlowLayout、GridLayout、 CardLayout、GridBagLayout
我们可以通过设置空布局管理器,来控制组件的大小和位置。调用setLayout(null)。
在设置空布局管理器后,必须对所有的组件调用setLocation(),setSize()或setBounds(),将它们定位在容器中。
java布局测试代码如下:
//java布局测试代码 import java.awt.BorderLayout; import java.awt.Button; import java.awt.CardLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class YourFrame extends Frame { /** * */ private static final long serialVersionUID = 1L; private Panel boderPanel; private Panel flowPanel; private Panel gridPanel; private Panel cardPanel; //事件监听类 class YourWindowListener extends WindowAdapter { } //框架类 public YourFrame(String strTitle) { super(strTitle); setSize(600,400); setLocation(100, 100);//设置起始位置 setBorderLayoutPanel(); setFlowLayoutPanel(); setGridPanel(); setCardLayout(); Color cl = new Color(0, 255, 0); setBackground(cl); setLayout(new GridLayout(2,2)); add(boderPanel); add(flowPanel); add(gridPanel); add(cardPanel); addWindowListener( new YourWindowListener() { public void windowClosing(WindowEvent arg0) { // TODO Auto-generated method stub System.exit(0); } }); } //BorderLayout布局 public void setBorderLayoutPanel() { boderPanel=new Panel(); boderPanel.setLayout(new BorderLayout()); Button btn1 = new Button("Center"); Button btn2 = new Button("East"); Button btn3 = new Button("South"); Button btn4 = new Button("West"); Button btn5 = new Button("North"); boderPanel.add(btn1, BorderLayout.CENTER); boderPanel.add(btn2, BorderLayout.EAST); boderPanel.add(btn3, BorderLayout.SOUTH); boderPanel.add(btn4, BorderLayout.WEST); boderPanel.add(btn5, BorderLayout.NORTH); } //FlowLayout布局 public void setFlowLayoutPanel() { flowPanel=new Panel(); flowPanel.setLayout(new FlowLayout()); Button btn1 = new Button("Java Button Test "); //更改标签字符串 btn1.addActionListener( new YourActionListener() { public void actionPerformed(ActionEvent e) { ((Button)e.getSource()).setLabel("Button Pressed"); } }); Button btn2 = new Button("Frame"); flowPanel.add(btn1); flowPanel.add(btn2); } //GridLayout布局 public void setGridPanel() { gridPanel=new Panel(); gridPanel.setLayout(new GridLayout(2,2)); Button btn1 = new Button("one"); Button btn2 = new Button("two"); Button btn3 = new Button("three"); Button btn4 = new Button("four"); gridPanel.add(btn1); gridPanel.add(btn2); gridPanel.add(btn3); gridPanel.add(btn4); } //CardLayout布局 public void setCardLayout() { final CardLayout cl=new CardLayout(); cardPanel=new Panel(); cardPanel.setLayout(cl); Button btn1 = new Button("黑桃A"); Button btn2 = new Button("红桃K"); ActionListener al =new ActionListener() { public void actionPerformed(ActionEvent e) { cl.next(cardPanel); } }; btn1.addActionListener(al); btn2.addActionListener(al); cardPanel.add(btn1,"1"); cardPanel.add(btn2,"2"); } @SuppressWarnings("deprecation") public static void main(String[] args) { YourFrame yf=new YourFrame("Frame Test"); yf.show(); } } class YourActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub } }
运行效果如下图所示:
3.AWT事件模型
Events(事件):描述发生了什么的对象。
Event source(事件源):事件的产生器。
Event handlers(事件处理器):接收事件对象、解释事件对象并处理用户交互的方法。
事件模型图解如下:
带菜单的文件读取测试程序代码如下:
import java.awt.FileDialog; import java.awt.Frame; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class HisFrame extends Frame { /** * */ class HisWindowListener extends WindowAdapter { } private static final long serialVersionUID = 1L; /** * @param args */ HisFrame(String strtitle) { super(strtitle); final HisFrame hf=this; setSize(400, 400); setLocation(100,100); //TextField tf=new TextField("",20); final TextArea ta=new TextArea(); add(ta); addWindowListener( new HisWindowListener() { public void windowClosing(WindowEvent arg0) { // TODO Auto-generated method stub System.exit(0); } }); //创建目录工具栏 MenuBar mb=new MenuBar(); //创建菜单和菜单项 Menu mFile=new Menu("File"); MenuItem mFile1=new MenuItem("New"); MenuItem mFile2=new MenuItem("Open"); //响应菜单命令 mFile2.addActionListener(new ActionListener() { @SuppressWarnings("deprecation") public void actionPerformed(ActionEvent e) { FileDialog fd=new FileDialog(hf,"Open File",FileDialog.LOAD); fd.show(); String strFile=fd.getDirectory()+fd.getFile(); //取得文件 if(!strFile.isEmpty()) { try { FileInputStream fis=new FileInputStream(strFile); byte[] buf=new byte[3000]; int len=fis.read(buf); String str=new String(buf,0,len); ta.append(str); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } } }); MenuItem mFile3=new MenuItem("Save"); MenuItem mFile4=new MenuItem("Save As"); MenuItem mFile5=new MenuItem("Exit"); mFile5.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); mFile.add(mFile1); mFile.add(mFile2); mFile.add(mFile3); mFile.add(mFile4); mFile.add(mFile5); mb.add(mFile); Menu mEdit=new Menu("Edit"); MenuItem mEdit1=new MenuItem("Undo"); MenuItem mEdit2=new MenuItem("Copy"); MenuItem mEdit3=new MenuItem("Cut"); MenuItem mEdit4=new MenuItem("Replace"); mEdit.add(mEdit1); mEdit.add(mEdit2); mEdit.add(mEdit3); mEdit.add(mEdit4); mb.add(mEdit); setMenuBar(mb); } public static void main(String[] args) { // TODO Auto-generated method stub HisFrame hf=new HisFrame("java Frame"); hf.show(); } }
程序运行效果如下图所示:
4.Java基础类
JFC(Java Foundation Classes):Java基础类,是关于GUI组件和服务的完整集合,主要包含5个API:AWT、Java2D、Accessibility、Drag & Drop、Swing。JFC提供了帮助开发人员设计复杂应用程序的一整套应用程序开发包。
Java2D是一套图形API,它为Java应用程序提供了一套高级的有关二维(2D)图形图像处理的类。Java2D API扩展了java.awt和java.awt.image类,并提供了丰富的绘图风格,定义了复杂图形的机制和精心调节绘制过程的方法和类。这些API使得独立于平台的图形应用程序的开发更加简便。
Accessibility API提供了一套高级工具,用以辅助开发使用非传统输入和输出的应用程序。它提供了一个辅助的技术接口,如:屏幕阅读器,屏幕放大器,听觉文本阅读器(语音处理)等等。
Drag & Drop技术提供了Java和本地应用程序之间的互操作性,用来在Java应用程序和不支持Java技术的应用程序之间交换数据。
JFC模块的重点在Swing。Swing用来进行基于窗口的应用程序开发,它提供了一套丰富的组件和工作框架,以指定GUI如何独立于平台地展现其视觉效果。 利用swing包中类建立界面程序测试代码如下:
import javax.swing.*; public class SwingTest { @SuppressWarnings("deprecation") public static void main(String[] args) { JFrame jf=new JFrame("JFrame"); jf.setSize(300, 400); jf.show(); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE ); JButton jb=new JButton("Javax.swing"); jf.getContentPane().add(jb); } }
//运行效果如下图所示:
利用系统提供的辅助工具,建立界面程序在此略去。