Java中的GUI編程

AWT

  • 包括了很多類和接口,用於java Application的GUI編程
  • GUI的各種元素有java類類實現
  • 使用AWT所涉及的類一般在java.awt包及其子包中
  • Container和Component是AWT中的兩個核心類

Component & Container

  • java的圖形用戶界面的嘴基本組成部分是Component,Component類及其子類的對象用來描述以圖形化的方式顯示在屏幕上並能與用戶進行交互的GUI元素,例如:一個按鈕,一個標籤等;
  • 一般的Component對象不能獨立的顯示出來,必須將放在某一個Container對象中纔可以顯示出來;
  • Container是Component的子類,Container子類對象可以容納別的Component對象;
  • Container對象可以使用add() 方法向其中添加其他Component對象;
  • Container是Component的子類,因此Container對象也可以被當作Component對象添加到其他Container對象中;
  • 有兩種常用的Container:
  • Window:其對象表示自由停泊的頂級窗口;
  • Panel:其對象可以作爲容納其他Component對象,但是不能獨立的存在,必須被添加到其他Container中。

 

Frame

  • Frame是window的子類,有Frame或子類創建的對象爲一個窗體;
  • Frame的常用構造方法:Frame()   Frame(String s)創建標題欄字符串s的窗口。

實例代碼:

import java.awt.*;
public class TestFrame{
	public static void main(String[] args){
		Frame f = new Frame("My First Test");
		f.setSize(600,400);
		f.setLocation(300,300);
		f.setBackground(Color.cyan);
		f.setVisible(true);
	}
}

Panel

  • Panel對象可以看成容納Component的空間;
  • Panel對象可以擁有自己的佈局管理器;
  • Panel類擁有從父類繼承來的setBounds(int x,int y,int width,int height)…
  • Panel的構造方法:Panel()使用默認的FlowLayout類佈局管理器初始化;
  • Panel(LayoutManager layout)使用指定的佈局管理器初始化。

實例代碼:

import java.awt.*;

public class TestPanel{
	public static void main(String[] args){
		Frame f = new Frame("Java Frame with Panel");
		Panel p = new Panel(null);
		f.setLayout(null);
		f.setBounds(300,300,500,500);
		f.setBackground(new Color(0,0,102));
		p.setBounds(50,50,400,400);
		p.setBackground(new Color(205,205,222));
		f.add(p);
		f.setVisible(true);
	}
}

佈局管理器

  • java語言中提供了佈局管理器類的對象可以管理Component在Container中的佈局,不必直接設置Component位置和大小;
  • 每個Container都有一個佈局管理器對象,當容器需要對某個組件進行定位或判斷其大小尺寸的時候,就會調用其對應的佈局管理器,調用Container的setLayout方法改變其佈局管理器對象;
  • AWT提供了5中佈局管理器類:FlowLayout;BorderLayout;GridLayout;CardLayout;GridBagLayout。

 

FLowLayout佈局管理器

  • FlowLayout是Panel類的默認佈局管理器:他是對組件進行逐行進行定位,行內從左到右一排滿後換行,不改變組件的大小,按主鍵原有尺寸顯示組件,可設置不同組件的間距,行距以及對齊方式;
  • FlowLayout佈局管理器默認的對齊方式是居中;
  • FlowLayout構造方法:new FlowLayout(FlowLayout.RIGHT,20,40)右對齊,組件之間水平間距20像素,垂直間距40像素;
  • New FlowLayout(FlowLayout.left);左對齊,水平和垂直間距爲缺省值(5);
  • New FlowLayout();使用缺省的居中對齊方式,水平和垂直間距爲缺省值(5);

實例代碼:

import java.awt.*;

public class TestFlowLayout{
	public static void main(String[] args){
		Frame f = new Frame("FlowLayout");
		Button button1 = new Button("OK");
		Button button2 = new Button("Open");
		Button button3 = new Button("Close");
		f.setLayout(new FlowLayout());
		f.add(button1);
		f.add(button2);
		f.add(button3);
		f.setSize(100,100);
		f.setVisible(true);
	}
}

BorderLayout佈局管理器

  • BorderLayout是Frame類的默認佈局管理器;
  • BorderLayout將整個容器的佈局劃分成:東(EAST),西(WEST),南(SOUTH),北(NORTH),中(CENTER)五個區域,組件只能添加到指定的區域;
  • 如不指定組件的加入部位,則默認加入到CENTER區;
  • 每個區域只能加入一個組件,如加入多個則先前加入的組件會被覆蓋。

實例代碼:

import java.awt.*;

public class TestBorderLayout{
	public static void main(String[] args){
		Frame f = new Frame("Border Layout");
		Button bn = new Button("BN");
		Button bs = new Button("BS");
		Button bw = new Button("BW");
		Button be = new Button("BE");
		Button bc = new Button("BC");
		f.add(bn,BorderLayout.NORTH);
		f.add(bs,BorderLayout.SOUTH);
		f.add(bw,BorderLayout.WEST);
		f.add(be,BorderLayout.EAST);
		f.add(bc,BorderLayout.CENTER);
		f.setSize(200,200);
		f.setVisible(true);
	}
}

GridLayout佈局管理器

  • GridLayout型佈局管理器將空間劃分成規則的巨型網格,每個單元格區域到校相等,組件被添加到每個單元小格中,先從左到右添加滿一行後換行,再從上到下;
  • 在GridLayout構造方法中指定分隔的行數和列數:

實例代碼:

import java.awt.*;

public class TestGridLayout{
	public static void main(String[] args){
		Frame f = new Frame("計算器");
		Button b1 = new Button("1");
		Button b2 = new Button("2");
		Button b3 = new Button("3");
		Button b11 = new Button("+");
		Button b12 = new Button("-");
		
		Button b4 = new Button("4");
		Button b5 = new Button("5");
		Button b6 = new Button("6");
		Button b13 = new Button("*");
		Button b14 = new Button("/");
		
		Button b7 = new Button("7");
		Button b8 = new Button("8");
		Button b9 = new Button("9");
		Button b15 = new Button("=");		
		Button b0 = new Button("0");

		f.setLayout(new GridLayout(3,5));
		f.add(b1);
		f.add(b2);
		f.add(b3);
		f.add(b11);
		f.add(b12);
		
		f.add(b4);
		f.add(b5);
		f.add(b6);
		f.add(b13);
		f.add(b14);
		
		f.add(b7);
		f.add(b8);
		f.add(b9);
		f.add(b0);
		f.add(b15);

		f.pack();
		f.setVisible(true);
	}
}

輸出結果:

佈局管理器總結:

Frame是一個頂級窗口,Frame的確實佈局管理器爲BorderLayout;

Panel無法獨立顯示,必須添加到某個容器中,Panel的缺省佈局管理器爲FlowLayout;

當把Panel作爲一個組件添加到某個容器中後,該Panel仍然可以有自己的佈局管理器;

使用佈局管理器時,佈局管理器負責各個組件的大小和位置,因此用戶無法在這種情況下設置組件的大小和位置屬性,如果試圖使用java語言提供的setLocation(),setSize(),setBounds()等方法,則會別局部管理器覆蓋;

如果用戶確實需要親自設置組件大小或位置,則應取消該容器的佈局管理器,方法爲setLayout(null);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章