Cỏc lớp thớch nghi

Một phần của tài liệu Bài giảng ngôn ngữ lập trình Java doc (Trang 101 - 148)

Ta thấy rằng việc khai bỏo đầy đủ 7 phương thức, cú những phương thức khụng xử lý gỡ cả làm cho chương trỡnh khụng được tối ưu. Giải phỏp ở đõy sẽ là định nghĩa một lớp trung gian, khai bỏo cài đặt giao diện WindowListener với đầy đủ 7 phương thức nhưng cỏc phương thức này cũng khụng làm gỡ cả. Cỏc lớp muốn cài đặt nội dung cho một sự kiện chỉ việc khai bỏo kế thừa lớp này và định nghĩa chồng phương thức cần thiết. Cỏc lớp cú vai trũ trung gian như vậy gọi là cỏc lớp thớch nghi. Với mỗi giao diện lắng nghe, ta cú một lớp thớch nghi tương ứng. Vớ dụ: WindowListener cú lớp thớch nghi WindowAdapter, MouseListener cú MouseAdapter. Cỏc lớp thớch nghi thường dựng là:

FocusAdapter MouseMotionAdapter KeyAdapter WindowAdapter MouseAdapter

class Terminator extends WindowAdapter {

public void windowClosing(WindowEvent e) {

System.exit(0); }

}

Vấn đề là cỏc lớp window thường phải khai bỏo kế thừa từ JFrame rồi nờn khụng thể khai bỏo kế thừa thờm lớp WindowAdapter. Lỳc này, kỹ thuật định nghĩa lớp nội nặc danh được phỏt huy:

frame.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent event) {

System.exit(0); }

public void windowIconified(WindowEvent e) {System.exit(0);} } );

Đoạn code này thực hiện cỏc cụng việc sau:

1. Định nghĩa một class nặc danh kế thừa lớp WindowAdapter

2. Thờm 2 phương thức windowClosing và windowIconified cho lớp nặc danh đú 3. Kế thừa 5 phương thức cũn lại từ WindowAdapter

4. Tạo ra một đối tượng của lớp đú, đối tượng cũng khụng cú tờn 5. Gửi đối tượng này cho phương thức addWindowListener

Ta cú thể định nghĩa chồng nhiều hơn một phương thức của WindowAdapter.

Tất nhiờn là khụng phải khi nào ta cũng phải sử dụng lớp nội nặc danh. Một cỏch làm khỏc là khai bỏo một lớp (thường là lớp nội) dạng như class Terminator ở trờn, sau đú đăng ký lắng nghe sự kiện cho frame mà khụng cần một đối tượng cú tờn rừ ràng của Terminator:

frame.addWindowListener(new Terminator());

Để kết thỳc đề tài này ta liệt kờ cỏc phương thức xử lý sự kiện như bảng sau:

Interface Methods Parameter/Accessors Nguồn sự kiện ActionListener actionPerformed ActionEvent • getActionCommand • getModifiers AbstractButton JComboBox JTextField Timer AdjustmentListener adjustmentvalueChanged AdjustmentEvent • getAdjustable • getAdjustmentType • getValue JScrollbar ItemListener ItemstateChanged ItemEvent • getItem • getItemSelectable • getStateChange AbstractButton JComboBox FocusListener FocusGained focusLost FocusEvent • isTemporary Component KeyListener keyPressed keyReleased keyTyped KeyEvent • getKeyChar • getKeyCode • getKeyModifiersText • getKeyText • isActionKey Component MouseListener mousePressed mouseReleased mouseEntered mouseExited mouseClicked MouseEvent • getClickCount • getX • getY • getPoint • TRanslatePoint Component

Interface Methods Parameter/Accessors Nguồn sự kiện

MouseMotionListener

mouseDragged

mouseMoved MouseEvent Component

MouseWheelListener mousewheelMoved MouseWheelEvent • getWheelRotation • getScrollAmount Component WindowListener windowClosing windowOpened windowIconified windowDeiconified windowClosed windowActivated windowDeactivated WindowEvent • getWindow Window WindowFocusListener windowGainedfocus windowlostFocus WindowEvent • getOppositeWindow Window WindowStateListener WindowStateChanged WindowEvent • getOldState • getNewState Window V. Xử lý cỏc sự kiện chuột

Cỏc sự kiện với chuột được xử lý bởi giao diện MouseListener. Khi một nguồn sự kiện được kớch hoạt bởi việc click chuột, cỏc phương thức xử lý cho cỏc sự kiện tương ứng được liệt kờ trong bảng trờn, đặc biệt hay dựng là mouseClicked(). Thụng thương ta cũng khụng cài đặt xử lý cho tất cả cỏc sự kiện này nờn ta khụng cài đặt giao diện MouseListener mà khai bỏo một lớp nội nặc danh kế thừa từ lớp thớch nghi MouseAdapter.

Giả sử cú một đối tượng JFrame tờn là frame, sau đõy là một vớ dụ quản lý sự kiện click chuột trờn nú:

frame. addMouseListener( new MouseAdapter() {

public void mouseClicked(MouseEvent e) // Mac dinh la chuot trai { // Kiem tra neu la chuot phai duoc click

if( (e.getModifiers() & InputEvent.BUTTON3_MASK)== InputEvent.BUTTON3_MASK) // hien thi mot popup menu tai vi tri click

jp.show(getContentPane(),e.getX(),e.getY()); }

} );

Tham khảo thờm tại:

http://java.sun.com/docs/books/tutorial/uiswing/events/handling.html

và http://java.sun.com/docs/books/tutorial/uiswing/events/mouselistener.html

Bài tập

1. Viết chương trỡnh xử lý sự kiện chuột click trờn cỏc Botton, nếu là chuột trỏi thỡ thụng bỏo là “Bạn vừa click chuột trai”, nếu là chuột phải thỡ thụng bỏo “Bạn vừa click chuột phải”. 2. Viết chương trỡnh sau khi chọn một Button trờn màn hỡnh, nhấn phớm x thỡ chương trỡnh kết thỳc.

Đề tài 9. Applet

Applet là một trong những kỹ thuật vượt trội của Java so với cỏc ngụn ngữ khỏc. Một Applet là một chương trỡnh Java được nhỳng vào trong cỏc trang web, nú đứng một vị trớ độc lập bờn cạnh cỏc phần khỏc của trang web.

I. Xõy dựng một Applet đơn giản

1. Soạn thảo một tệp cú tờn “Hello.java” như sau: import java.applet.Applet; //khai bỏo thư viện import java.awt.Graphics;

//Khai bỏo đồ hoạ

public class Hello extends Applet { //cài đặt phương thức cho Applet public void paint(Graphics g){ g.drawString("Hello!", 50, 25); }

2. Biờn dịch tệp Hello.java

3. Soạn thảo một trang HTML cú tờn hello.htm <html><body>

<applet>

<applet code="Hello.class" width=150 height=25> </applet>

</body></html>

4. Đặt file Hello.class và hello.htm vào trong cựng một thư mục 5. Mở file hello.htm.

Tuy nhiờn để cỏc applet cú thể chạy được, nú cần một JVM trờn mỏy cục bộ. Để cú được JVM cho cỏc trỡnh duyệt ta cần cài phiờn bản Java lờn mỏy tớnh cục bộ và tớch hợp vào trỡnh duyệt như một plug-in.

Trong cỏc phiờn bản Java gần đõy, người lập trỡnh cú thể sử dụng thư viện swing nằm trong gúi javax.swing để cú được giao diện GUI thống nhất trờn mọi hệ thống. Cỏc lớp trong swing cú tờn gọi khỏc so với cỏc lớp trong awt bởi thờm ký tự đầu tiờn “J”.

II. Cấu trỳc cơ bản và vũng đời của một Applet

Một chương trỡnh Applet đầy đủ sẽ bao gồm cỏc thành phần như sau: import java.applet.Applet;

public class myApplet extends Applet{ public void init(){ ... }

public void start(){ ... } public void stop() { ... } public void destroy() { ... } .... //Cỏc phương thức khỏc }

Nếu dựng JApplet thỡ ta cú khai bỏo phần đầu như sau: import javax.swing.JApplet;

public class myApplet extends JApplet{…}

Vũng đời của một Applet được đỏnh dấu bởi cỏc sự kiện diễn ra ở mỗi giai đoạn, lập trỡnh viờn cần nắm được ý nghĩa của từng giai đoạn để cú thể viết code điều khiển Applet:

1. Giai đoạn init: Thực hiện cỏc cụng việc khởi tạo một Applet. Giai đoạn này được bắt đầu ngay sau khi thẻ <param> nằm trong thẻ <applet> được xử lý. Cỏc hành động như thờm cỏc thành phần giao diện người dựng GUI được thực hiện ở đõy. 2. Giai đoạn start: Được thực hiện ngay sau khi giai đoạn init được thực hiện xong.

Nú cũng được gọi bất cứ khi nào người dựng chuyển sang một trang web khỏc rồi quay lại trang cú applet. Do đú, code nằm trong start cú thể được thực hiện nhiều lần trong khi code trong init chỉ được thực hiện 1 lần.

3. Giai đoạn stop: Được thực hiện khi người dựng rời khỏi trang web chứa applet. Do đú, code nằm trong stop cũng cú thể được thực hiện nhiều lần.

4. Giai đoạn destroy: Được thực hiện khi người sử dụng tắt trỡnh duyệt.

Khi viết một applet, chỳng ta khụng phải khi nào cũng cài đặt đầy đủ 4 phương thức mà tựy theo nhu cầu.

Vớ dụ sau xõy dựng một applet cho phộp vẽ liờn tiếp bắt đầu từ vị trớ giữa applet. import java.applet.*;

import java.awt.*; import java.awt.event.*;

public class AppletSample extends Applet {

Point curentPoint; // Lưu tọa độ điểm hiện tại public void init()

{

curentPoint = new Point(this.getWidth()/2,this.getHeight()/2); this.setBackground(Color.CYAN); // đặt màu nền của applet }

public void start() {

this.addMouseListener( new MouseAdapter() {

public void mouseClicked(MouseEvent e) { drawOnApplet(curentPoint,e.getPoint()); curentPoint = e.getPoint(); } } ); }

public void drawOnApplet(Point p1, Point p2) {

Graphics g = this.getGraphics(); g.drawLine(p1.x,p1.y,p2.x,p2.y); }

III. An ninh và khả năng của Applet

Vỡ applet được download từ xa và thực hiện trờn mỏy tớnh cụ bộ nờn vấn đề về an ninh được quan tõm đặc biệt. Cỏc nguyờn tắc về an ninh của một applet là:

• Applet khụng bao giờ thực hiện một chương trỡnh của mỏy cục bộ.

• Applet khụng thể giao tiếp với cỏc mỏy tớnh khỏc trờn mạng trừ mỏy tớnh mà nú được download về.

• Applet khụng thể đọc và ghi dữ liệu lờn mỏy tớnh cục bộ

• Applet khụng thể tỡm thấy thụng tin gỡ về mỏy tớnh cuc bộ, trừ cỏc thụng tin như phiờn bản Java, tờn và phiờn bản hệ điều hành, ký tự phõn tỏch file, đường dẫn. Applet khụng thể tỡm thấy cỏc thụng tin cỏ nhõn như email, password,…

• Tất cả cỏc cửa sổ trỡnh duyệt cú applet được tải về đều cú thụng bỏo.

Những yờu cầu về an ninh của applet là rất quan trọng. Trong một số trường hợp ta cú thể cấu hỡnh để applet được tin cậy và cú thể truy cập vào mỏy tớnh cục bộ giống như một chương trỡnh đang chạy trờn mỏy tớnh đú.

• Applet cũng cú những khả năng như: • Tạo kết nối đến mỏy đang chạy nú.

• Applet dễ dàng dựng cỏc siờu văn bản hiển thị.

• Cú thể gọi đến cỏc phương thức toàn cục của cỏc applet khỏc trờn cựng trang web. Applet cú thẻ giao tiếp với cỏc applet khỏc trờn trang web cũng như với cỏc đối tượng khỏc trờn trang web thụng qua cơ chế riờng.

• Cỏc applet được nạp từ hệ thống tập tin cục bộ sẽ khụng bị cỏc giới hạn của cỏc applet được nạp từ mạng xuống.

• Khụng nhất thiết là cỏc applet sẽ ngừng lại khi ta thoỏt khỏi cỏc trang web chứa nú.

IV. Ứng dụng Applet với của sổ Popup

Với Applet chỳng ta hoàn toàn cú thể cú thờm cỏc cửa sổ pop-up để mở rộng khụng gian làm việc. Sau đõy là một Japplet cú thể mở một Frame mới.

import java.awt.*; import java.awt.event.*; import javax.swing.*;

public class PopupCalculatorApplet extends JApplet {

public void init() {

// Tạo một frame với một cửa sổ panel final JFrame frame = new JFrame(); frame.setTitle("Calculator");

frame.setSize(200, 200);

// Thờm một Button để ẩn/ hiện frame pop-up JButton calcButton = new JButton("Calculator"); add(calcButton);

calcButton.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent event) { frame.setVisible(!frame.isVisible()); } }); } } V. Cỏc thẻ HTML của Applet

Một khai bỏo applet trong trang HTML thường cú dạng:

<applet code="NotHelloWorldApplet.class" width="300" height="100"> Thong tin duoc hien thi khi applet khong hien thi

</applet>

Sau đõy ta sẽ tỡm hiểu cỏc thuộc tớnh của applet: Cỏc thuộc tớnh về vị trớ:

• height: Chiều cao của applet. Cỏc applet khụng thể thay đổi kớch thước khi đó chạy.

• width: Chiều rộng của applet

• align: Xỏc định vị trớ của applet so với cỏc văn bản xung quanh nú. Cỏc giỏ trị của align cú thể là: left, right, middle, top, texttop, absmiddle, baseline, bottom, absbottom, vspace và hspace.

Cỏc thuộc tớnh về chương trỡnh nguồn- code:

code : Thuộc tớnh này cho biết tờn của class chứa chương tỡnh applet. Tờn này là tương đối so với giỏ trị codebase hoặc với thư mục hiện hành nếu khụng cú codebase. Đường dẫn phải phự hợp với đường dẫn gúi của class applet. Vớ dụ: nếu applet cú tờn MyApplet.class được đặt trong gúi com.mycompany thỡ đường dẫn phải là:

code="com/mycompany/MyApplet.class". hoặc:

code="com.mycompany.MyApplet.class" cũng được chấp nhận.

- codebase: Là một thuộc tớnh tựy chọn để xỏc định đường dẫn tuyệt đối nơi chứa class ở giỏ trị code.

archive: Chứa tờn cỏc gúi chương trỡnh hoặc tài nguyờn khỏc được tải về kốm theo applet. Cỏc gúi chương trỡnh được nộn ở dạng file JAR và được đặt cỏch nhau bởi dấu ,. Vớ dụ:

<applet code="CalculatorApplet.class"

archive="CalculatorClasses.jar,corejava/CoreJavaClasses.jar" width="100" height="150">

object: Chứa tờn file đó được tuần tự húa của một applet.

name: Tờn của applet. Trong cỏc trỡnh duyệt của Netscape hoặt Windows đều cho phộp applet giao tiếp với cỏc đối tượng javascript khỏc trờn trang web. Khi đú applet cần cú tờn để truy cập.

Ngoài ra Java cho phộp ta định nghĩa cỏc tham số cho applet thụng qua cỏc thẻ <param> Vớ dụ:

<applet code="FontParamApplet.class" width="200" height="200"> <param name="font" value="Helvetica"/>

</applet>

Khi đú trong chương trinh applet, ta cú thể lấy ra để sử dụng: public class FontParamApplet extends JApplet

{

public void init() {

String fontName = getParameter("font");

int fontSize = Integer.parseInt(getParameter("size")); . . .

} }

VI. Cỏc phương thức, lập trỡnh đồ họa và bắt sự kiện của applet

• public void paint(Graphics g) {...}: Là phương thức hiển thị cơ bản, thường cỏc applet dựng paint() để biểu diễn cỏc hoạt động của mỡnh trờn trang web.

• public void update(Graphics g) {...}: là phương thức ta dựng sau khi thực hiện pain() nhằm làm tăng hiệu quả vẽ.

Ngoài ra Applet cũn thừa hưởng cỏc phương thức từ lớp AWT.

• Phương thức repaint() được dựng khi cửa sổ cần cập nhật lại. Phương thức này chỉ cần một tham số là đối tượng của lớp Graphics.

• getDocumentBase(): cho biết địa chỉ dạng URL của thư mục chứa tập tin HTML chứa applet.

• getCodeBase(): Cho biết địa chỉ dạng URL của thư mục chứa tập tin .CLASS của applet.

• getImage(URL url, String name): trả về một đối tượng ảnh hiển thị trờn nền. • getLocale(): Xỏc định vị trớ applet.

• getAudioClip(URL url, String name): cho đối tuợng audio. • showStatus(String st): hiển thị xõu st trờn thanh trang thỏi.

• drawChars(char array[ ], int offset, int length, int xCoor, int yCoor): xuất cỏc ký tự. Chỳ thớch cỏc tham số: array: Mảng cỏc ký tự; offset: Vị trớ bắt đầu, nơi cỏc ký tự được vẽ.; length: Số cỏc ký tự cần được vẽ; xCoor: Toạ độ X, nơi cỏc ký tự cần được vẽ; yCoor: Toạ độ Y, nơi cỏc ký tự cần được vẽ.

• drawBytes(byte array[ ], int offset, int length, int xCoor, int yCoor): xuất cỏc byte ra.Trong đú array: Mảng cỏc byte.;Vị trớ offset hay vị trớ bắt đầu; length: Số byte cần vẽ; xCoor: Toạ độ X; yCoor: Toạ độ Y.

• drawLine(int x1, int y1, int x2, int y2): Vẽ đường thẳng từ A(x1, y1) đến B(x2, y2).

• drawOval(int xCoor, int yCoor, int width, int height): Vẽ đường oval.

• fillOval(int xCoor, int yCoor, int width, int height): Vẽ hỡnh oval đặc.Trong đú: width là Chiều rộng của hỡnh, height là Chiều cao của hỡnh.

• drawRect(int xCoor, int yCoor, int width, int height): Vẽ hỡnh chữ nhật. • fillRect(int xCoor, int yCoor, int width, int height): Vẽ hỡnh chữ nhật đặc.

• drawRoundRect(int xCoor, int yCoor, int width, int height, int arcwidth, int archeight): Vẽ hỡnh chữ nhật cú bo gúc.

• fillRoundRect(int xCoor, int yCoor, int width, int height, int arcwidth, int archeight): vẽ hỡnh chữ nhật bo gúc đặc.

Trong đú: arcwidth: làm trũn gúc trỏi và gúc phải của hỡnh chữ nhật. archeight: làm trũn gúc trờn đỉnh và gúc đỏy của hỡnh chữ nhật.

Vớ dụ, arcwidth = 20 cú nghĩa là hỡnh chữ nhật được làm trũn cạnh trỏi và cạnh phải mỗi cạnh 10 pixel.

• draw3Drect(int xCoord, int yCoord, int width, int height, boolean raised): Vẽ hỡnh chữ nhật 3D.

• drawArc(int xCoord, int yCoord, int width, int height, int arcwidth, int archeight): Vẽ hỡnh cung.

• fillArc(int xCoord, int yCoord, int width, int height, int arcwidth, int archeight): Vẽ hỡnh cung đặc.

Trong đú: xCoord: Toạ độ x; yCoord: Toạ độ y.

width: Chiều rộng của cung được vẽ; height: Chiều cao của cung được vẽ.

arcwidth: Gúc bắt đầu; archeight: Độ rộng của cung (gúc của cung) so với gúc ban đầu. • drawPolyline(int xArray[ ], int yArray[ ], int totalPoints): Vẽ nhiều đường thẳng Trong đú: xArray: Mảng lưu trữ toạ độ x của cỏc điểm; yArray: Mảng lưu trữ toạ độ y của cỏc điểm; totalPoints: Tổng số điểm cần vẽ.

• setFont(new Font(“Times Roman”, Font.BOLD, 15)): Đặt Font cho chữ, (Font.BOLD, Font.PLAIN, Font.ITALIC)

• drawPolygon(int x[ ], int y[ ], int numPoints):Vẽ đa giỏc. • fillPolygon(int x[ ], int y[ ], int numPoints): Vẽ đa giỏc đặc.

Trong đú: x[ ]: Mảng lưu trữ toạ độ x của cỏc điểm; y[ ]: Mảng lưu trữ toạ độ y của cỏc điểm; numPoints: Tổng số điểm cần vẽ; setColor(Color c): Đặt màu vẽ.

Bảng một số màu cơ bản: Color.white Color.black Color.orange Color.gray Color.lightgray Color.darkgray Color.red Color.green Color.blue Color.pink Color.cyan Color.magenta Color.yellow

Đề tài 10. Lập trỡnh giao diện đồ họa GUI

I. Giới thiệu AWT

Abstract Windows Toolkit – AWT: Là thư viện của Java cung cấp cho lập trỡnh viờn cỏc giải phỏp giao diện người dựng đồ hoạ (Graphical User Interface - GUI) thõn thiện.

Một giao diện người dựng được hỡnh thành từ cỏc phần tử của GUI. Một phần tử GUI được thiết lập bằng cỏch sử dụng cỏc thủ tục:

1. Tạo đối tượng.

2. Xỏc định sự xuất hiện ban đầu của đối tượng. 3. Chỉ ra nú nằm ở đõu.

4. Thờm phần tử vào giao diện trờn màn hỡnh.

Để làm việc với cỏc đối tượng GUI chỳng ta cần nhập gúi java.awt.*.

AWT cung cấp cỏc thành phần khỏc nhau để tạo GUI hiệu quả, cỏc thành phần này cú thể là:

• Vật chứa (Container). • Thành phần (Component).

• Trỡnh quản lý cỏch trỡnh bày (Layout manager). • Đồ hoạ (Graphics) và cỏc tớnh năng vẽ (draw). • Phụng chữ (Font).

• Sự kiện (Event).

Từ phiờn bản 1.4, Java phỏt triển một thư viện mở rộng mới với đa số cỏc lớp GUI kế thừa từ AWT nhưng cú khả năng di động tốt hơn. Cỏc lớp GUI trong swing cú thờm tiền tố “J” so với cỏc lớp trong AWT. Sau đõy, chỳng ta sẽ xột cỏc thành phần GUI trong swing.

Sơ đồ phõn cấp thừa kế cỏc đối tượng GUI trong swing như sau:

II. Vật chứa (Container)

Là vựng mà ta cú thể đặt cỏc thành phần (component) của giao diện. Một vật chứa cú thể

Một phần của tài liệu Bài giảng ngôn ngữ lập trình Java doc (Trang 101 - 148)