1. 程式人生 > >java學習筆記圖形程式設計及GUI應用小結(1)

java學習筆記圖形程式設計及GUI應用小結(1)

Swing介紹

Swing是不對等基於GUI工具箱的正式名字。它已是Java基礎類庫(Java Foundation Class)JFC的一部分了。Swing沒有完全替代AWT,而是基於AWT架構之上。Swing是指“被繪製的”使用者介面類;AWT是指像事件處理這樣的視窗工具箱的底層機制。

Swing特點:

1、Swing擁有一個豐富、便捷的使用者介面元素集合。

2、Swing對底層平臺依賴的很少,因此與平臺相關的bug少。

3、Swing給予不同平臺的使用者一致的感覺。

Java為GUI提供的物件都村在java.awt和javax.Swing兩個包中。

GUI:(Graphical User Interface)圖形使用者介面。用圖形的方式來顯示計算機的操作的介面,這樣更方便直觀。

GLI:(Command Line User Interface)命令列使用者介面。常見的Dos命令列操作,要記憶命令,操作補直觀。

           舉例:比如建立資料夾,或者刪除資料夾等。

java.awt:Abstract Window ToolKit(抽象視窗工具包),需要呼叫本地系統方法實現功能(依賴平臺,跨平臺性補              是很好)。屬重量級控制元件。提供了一些視窗當中所使用的元件。

javax.Swing:在AWT的基礎上,建立的一套圖形介面系統,其中提供了更多的元件,而且完全由JAVA實現。增強了               移植性,屬輕量級控制元件。(用他開發的元件、圖形化介面在任何系統下顯示都相同。屬輕量級)

AWT中的物件

Component類:是一個具有圖形表示能力的物件,可在螢幕上顯示,並可與使用者進行互動。典型圖形使用者介面中的按         鈕、複選框、和滾動條都是元件示例。

Container類:可以包含其他AWT元件的元件。

建立圖形化介面大體步驟:

1、建立Frame窗體。

2、對窗體進行基本設定,如大小,位置,佈局。

3、定義元件。

4、將元件通過窗體的add方法新增到窗體中。

5、讓窗體顯示,通過setVisible(true)。

GUI元件詳述

一、框架

Java中,框架被設計為放置元件的容器,可以將選單欄和其他的使用者介面元素放置在其中。在JFrame中有四層面板。其中根面板、層級面板和玻璃面板人們並不太關心;它們是用來組織選單欄和內容窗格以及實現觀感的。Swing程式設計師最關心的是內容窗格。

在Java中,頂層視窗被稱為框架(frame)。在AWT庫中有一個稱為Frame的類,用於描述頂層視窗。這個類的Swing版本名為JFrame,他擴充套件於Frame類。絕大多數Swing元件類都以“J”開頭。

定義一個框架類:

class SimpleFrame extends JFrame

{

public SimpleFrame()

        {setSize(300,200);}   //  設定框架大小,如果沒有明確地指定框架的大小,所有框架的預設值為0*0。

}

例項框架物件:

SimpleFrame frame = new SimpleFrame();

框架方法說明:

在Java SE5.0中,可以直接呼叫frame.add(c)新增元件。

從JFrame的各個超類中繼承了許多用於處理框架大小和位置的方法:

setLocation和setBounds方法用於設定框架的位置。

setIconImage用於告訴視窗系統在標題欄、任務切換視窗等位置顯示哪個圖示。

setTitle用於改變標題欄的文字。

setResizable利用一個boolean值確定框架的大小是否允許使用者改變。

booleanisResizable()

voidsetResizable(boolean b):獲取或設定resizable屬性。這個屬性設定後,使用者可以重新設定框架的大小。

String getTitle()

VoidsetTitle(String s)  獲取或設定title屬性,確定框架標題欄中的文字。

ImagegetIconImage()

voidsetIconImage(Image image)  獲取或設定iconImage屬性,這個屬性確定框架的圖示。

booleanisUndecorated() 1.4

voidsetUndecorated(boolean b) 1.4 獲取或設定undecorated屬性。這個屬性設定後,框架顯示中將沒有標題欄或關閉按鈕這樣的裝飾。在框架顯示之前必須呼叫這個方法。

intgetExtendedState() 1.4

voidsetExtendedState(int state) 1.4 獲取或設定視窗狀態(包括五種:)

1、Frame.NORMAL       2、Frame.ICONIFIED       3、Frame.MAXIMIZED_HORIZ

4、Frame.MAXIMIZED_VERT        5、Frame.MAXIMIZED_BOTH


Java中,框架被設計為放置元件的容器,可以將選單欄和其他的使用者介面元素放置在其中。

二、顯示文字

Java中所有的繪製都必須使用Graphics物件,其中包含了繪製圖案、影象和文字的方法。

無論何種原因,只要視窗需要重新繪圖,事件處理器就會通告元件,從而引發執行所有元件的paintComponent方法。一定不要自己呼叫paintComponent方法。在應用程式需要重新繪圖的時候,這個方法將被自動地呼叫。

如果需要強制重新整理螢幕,就需要呼叫repaint方法。對於螢幕顯示來說Graphics物件的度量單位是畫素。

顯示文字是一種特殊的繪圖。在Graphics類中有一個drawString方法呼叫的語法格式為:g.drawString(text,x,y);]

在框架中繪製一段文字:

public class NotHelloWorld

{

public static void main(String[] args)

        EventQueue.invokeLater(new Runnable)

        {

       public void run()

{

JFrame frame = new NotHelloWorldFrame();

frame.setTitle("NotHelloWorld");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

        }

}

class NotHelloWorldFrame extends JFrame

{

public NotHelloWorldFrame()

{

add(newNotHelloWorldComponent());

pack();

}

}

class NotHelloWorldComponent extends JComponent   // 定義文字類,繼承自JComponent類

{

public void paintComponent(Graphics g)

{

g.drawString("Not a Hello,World program",75,100);    //  文字內容和位置座標為引數

}

public Dimension getPreferredSize(){   return new Dimension(300,200);   }     //  返回文字尺寸

}


在框架中填入一個或多個元件時,如果你只想使用它們的首選大小,可以呼叫pack方法。

JPanel是一個可以包含其他元件的容器,但同樣也可以在其上面進行繪製。

三、繪製2D圖形

Java SE 1.2引入了Java2D庫,要想使用Java 2D庫繪製圖形,需要獲得一個Graphics2D類物件。這個類是Graphics類的子類。自從Java SE 2版本以來,paintComponent方法就會自動地獲得一個Graphics2D類物件,我們只需要進行一次型別轉換就可以了:public void paintComponent(Graphicsg){Graphics2D g2 = (Graphics2D) g; … }

在1.0的繪製方法中,採用的是整型畫素座標,而Java2D圖形採用的是浮點座標。使用者可使用有意義的形式例如微米或英寸指定圖形的座標,然後在將其轉換成畫素,這樣方便。2D庫的設計者決定為每個圖形類提供兩個版本:一個是為那些節省空間的程式設計師提供的float型別的座標,另一個是為那些懶惰的程式設計師提供的double型別的座標。

Rectangle2D類,這是一個擁有兩個具體子類的抽象類,這兩個具體子類也是靜態內部類:Rectangle2D.Float 和   Rectangle2D.Double

建立Rectangle2D.Float物件:(構造引數表示矩形的左上角位置、寬和高)

Rectangle2DfloatRect = new Rectangle2D.Float(10.0F,25.0F,22.5F,20.0F);

Rectangle2DdoubleRect = new Rectangle2D.Double(10.0,25.0,22.5,20.0)

Rectangle2D方法的引數和返回值均為double型別。例如,即使Rectangle2D.Float物件儲存float型別的寬度,getWidth方法也返回一個double值。

Point2D類也有兩個子類,Point2D.Float和Point2D.Double構造方法為:Point2Dp = new Point2D.Double(10,20);

構造橢圓:

通常可以知道橢圓的中心、寬和高,而不是外接矩形的定點。setFrameFromCenter方法使用中心點,但仍然要給出四個頂點中的一個因此,通常採用下 列方式構造橢圓:

Ellipse2Dellipse = new Ellipse2D.Double(centerX-width/2,center-height/2,width,height);

構造一條直線:

Line2D line =new Line2D.Double(start,end);

Line2Dline = new Line2D.Double(staartX,startY,endX,endY);

2D圖形繪製方法說明:

java.awt.geom.RectangularShape 1.2

doublegetCenterX()

doublegetCenterY()

doublegetMinX()

doublegetMinY()

doublegetMaxX()

doublegetMaxY()  返回閉合矩形的中心,以及最小、最大x和y座標值

doublegetWidth()

doublegetHeight()  返回閉合矩形的寬和高

double getX()

doublegetY()  返回閉合矩形左上角的x和y座標。

java.awt.geom.Rectangle2D.Double 1.2

Rectangle2D.Double(doublex,double y,double w,double h)

利用給定的左上角、寬和高,構造一個矩形。

java.awt.geom.Rectangle2D.Float 1.2

Rectangle2D.Float(floatx,float y,float w,float h)

利用給定的左上角、寬和高的外接矩形,構造一個橢圓

java.awt.geom.Ellipse2D.Double 1.2

Ellipse2D.Double(doublex,double y,double w,double h)

利用給定的左上角、寬和高的外接矩形,構造一個橢圓。

java.awt.geom.Point2D.Double 1.2

Point2D.Double(doublex,double y)  利用給定座標構造一個點。

java.awt.geom.Line2D.Double 1.2

Line2D.Double(Point2Dstart,Point2D end)

Line2D.Double(doublestartX,double startY,double endX,double endY)

使用給定的起點和終點,構造一條直線。

四、Color類

使用Graphics2D類的setPaint方法可以為圖形環境上的所有後續的繪製才做選擇顏色:gs.setPaint(Color.RED);      gs.drawString(“warning!”,100,100);只需將呼叫draw替換為呼叫fill就可以用一種顏色填充一個封閉圖形:Rectangle2Drect=…;    g2.setPaint(Color.RED);    g2.fill(rect);

Color類用於定義顏色。java.awt.Color類中提供了13個預定義的常量代表13種標準顏色。

可以通過提供紅、綠和藍三色成分來建立一個Color物件,以達到定製顏色的目的。呼叫Color構造器的格式為:Color(int redness,intgreenness,int blueness) 

如例:gs.setPaint(newColor(0,128,128));   g2.drawString(“Welcome!”,75,125);

使用Graphics物件而不是Graphics2D物件,就需要使用setColor方法設定顏色。

要想設定背景色,要使用Component類中的setBackground方法,Component類是JComponent 類的祖先。

Color類中的brighter()方法和darker()方法的功能,他們分別加亮或變暗當前的顏色。

Java在SystemColor類中預定義了很多顏色的名字。在這個類中的常量,封裝了使用者系統的各個元素的顏色。如p.setBackGround(SystemColor.window)

Color類方法說明:

java.awt.Color 1.0

Color(int r,intg,int b)  建立一個顏色物件

java.awt.Graphics 1.0

ColorgetColor()

voidsetColor(Color c)   獲取或改變當前的顏色。後續所有繪圖操作使用新顏色。

java.awt.Graphics2D 1.2

PaintgetPaint()

voidsetPaint(Paint p)  獲取或設定這個圖形環境的繪製屬性。

void fill(Shapes)  用當前的顏料填充該圖形。

java.awt.Component 1.0

ColorgetBackground()

voidsetBackground(Color c)  獲取或設定背景顏色。

ColorgetForeground()

voidsetForeground(Color c)  獲取或設定前景顏色。

五、字型

人們可以通過字型名指定一種字型。

GraphicsEnvironment類中的getAvailableFontFamilyNames方法。這個方法將返回一個字串型陣列,其中包含了所有可用的字型名。GraphicsEnvironment類描述了使用者系統的圖形環境,為了得到這個類的物件,需要呼叫靜態的getLocalGraphicsEnvironment方法:

獲取當前系統允許使用的字型,返回字串陣列:

String[] fontNames = GraphicsEnvironment().getLocalGraphicsEnvironment().getAvailableFontFamilyNames();

要想使用某種字型繪製字元,必須首先利用指定的字型名、字型風格和字型大小來建立一個Font類物件。下面是構造一個Font物件的例子:Font sansbold14 = new Font(“SansSerif”,font.BOLD,14);  (字型名、風格、大小)

字型風格有四種:font.PLAIN、font.BOLD、font.ITALIC、font.BOLD+ font.ITALIC

可以使用driveFont方法得到希望大小的字型:Font f =f1.deriveFont(14.0F); 

driveFont方法有兩個過載版本。一個(有一個float引數)設定字型的大小。另一個(有一個int引數)設定字型風格。所以f.deriveFont(14)設定的是字型風格,而不是大小(其結果為斜體,因為14的二進位制表示的是ITALIC,而不是BOLD)。例如:

 Font sansbold14 = new Font(“SansSerif”,Font.BOLD,14);

 g2.setFont(sansbold14);

 String message = “Hello,World!”;

 g2.drawString(message,75,100);

想要得到螢幕裝置字型屬性的描述物件,需要呼叫Graphics2D類中的getFontRenderContext方法。它將返回一個FontRenderContext類物件。可以直接將這個物件傳遞給Font類的getStringBounds方法:

FontRenderContextcontext = g2.getFontRenderContext();

Rectangle2Dbounds = f.getStringBounds(message,context);

getStringBounds方法將返回包圍字串的矩形。

字型方法說明:

java.awt.Font 1.0

Font(Stringname,int style,int size)  建立一個新字型物件。

StringgetFontName()  返回字型名。

StringgetFamily()  返回字型家族名。

StringgetName()  如果採用邏輯字型名建立字型,將返回邏輯字型。

Rectangle2D getStringBounds(Strings,FontRenderContext context) 1.2

返回包圍這個字串的矩形。矩形的起點為基線。矩形頂端的y座標等於上坡度的負值。

矩形的高度等於上坡度、下坡度和行間距之和。寬度等於字串的寬度。

LineMetricsgetLineMetrics(String s,FontRenderContext context) 1.2

返回測定字串寬度的一個線性metrics物件。

FontderiveFont(int style) 1.2 

FontderiveFont(float size) 1.2

FontderiveFont(int style,float size) 1.2

返回一個新字型,除給定大小和字型風格外,其餘與原字型一樣。

java.awt.Graphics 1.0

Font getFont()

voidsetFont(Font font) 獲取或設定當前字型。這種字型將被應用於後續的文字繪製操作中。

void drawstring(Stringstr,int x,int y) 採用當前字型和顏色繪製一個字串。

java.awt.Graphics2D 1.2

FontRenderContextgetFontRenderContext()

返回這個圖形文字中,指定字型特徵的字型繪製環境。

voiddrawstring(String str,float x,float y) 採用當前的字型和顏色繪製一個字串