java程式設計--孫鑫java無難事Lesson10《Java圖形介面編程》
本節要點:
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); }}
//運行效果如所示:
利用系統提供的協助工具輔助,建立介面程式在此略去。