Thứ Hai, 3 tháng 1, 2011

tu hoc java

Điều trước tiên khi học Java là bạn phải có trong tay 2 thứ:

1. Phần mềm jdk1.3 (hoặc 1.4) dùng để biên dịch các file java.
2. Phần mềm dùng để soạn thảo code java, bạn có thể dùng notepad nhưng nếu chuyên nghiệp hơn thì bạn nên dùng JCreator,Jpad, JBuider . . . Ở đây mình dùng JCreator.



Phần I : Một số khái niệm.

I - Một số khái niệm:

Lập trình hướng đối tượng (OOP)

Trừu tượng hóa dữ liệu (Data Abstraction)

Lớp và Đối tượng (Class & Object)

Khởi dựng và Huỷ diệt (Construction & Destruction)

Che dấu dữ liệu (Data Encapsulation)

Thừa kế, Đa thừa kế (Inheritance & Multiple Inheritence)

Đa hình thái (Polymorphism)

II - Cách dịch trong Java:

user posted image

III - Các thể loại ứng dụng Java:

Applets: nhúng vào trang web để chạy
Command Line: Ứng dụng này giao tiếp thông qua chế độ dòng lệnh (màn hình DOS).
GUI (Graphics User Interface): Như command line nhưng người dùng giao tiếp với ứng dụng thông qua form nhập liệu (thân thiện với người dùng)
Servlets/JSP: Thuộc thể loại ứng dụng web, phối hợp với web server để thực hiện.
Database: Cho phép quản lý CSDL quan hệ (SQL Server, Oracle,...)
RMI: Xây dựng các ứng dụng phân tán.
EJB: Thể loại ứng dụng được thực hiện theo mô hình đa tầng trên nền của J2EE.

IV - Khai thác Java:

java.lang : Các lớp cơ bản của ngôn ngữ
java.util : Các lớp tiện ích trong java java
java.awt : Các lớp hỗ trợ xây dựng GUI
java.awt.event : Các lớp giúp xử lý sự kiện
java.applet : Các lớp hỗ trợ xây dựng applet
java.io : Các lớp hỗ trợ xử lý vào ra
java.net : Các lớp giúp lập trình TCP/IP
java.rmi : Các lớp giúp lập trình phân tán
java.sql : Các lớp giúp lập trình quản lý CSDL
java.security : Các lớp hỗ trợ lập trình an toàn hệ thống

V - Công cụ phát triển Java - JDK:

javac : dịch byte code (*.class)
javah : dịch header (*.h) để sử dụng trong C
javadoc : tạo tài liệu API (*.html)
java : chạy ứng dụng java
appletviewer : chạy applet trên trang web

VI - Ví dụ và cách dịch một file java.

- Ví dụ:

package lessons.java.test;
import java.lang.*;
public class HelloWorld{
/**
This is my first java program. The main method is entry point of an application.
*/
public static void main(String[] args){
System.out.println(“Hello World !”);
}
}

- Các cách dịch: (từ cửa sổ Command Prompt)

Javac –d c:\java HelloWorld.java

Javah HelloWorld.java

Javadoc HelloWorld.java

Java lessons.java.test.HelloWorld

===============
Đối với các bạn mới làm quen với Java thì có lẽ hơi khó hiểu, bạn chịu khó nha, rồi cũng sẽ quen thui.

Phần II : Khái niệm về Package – Import – Class – Modifier và Interface.

I - Cấu trúc mã nguồn của Java:

package : Định nghĩa gói
imports : Chỉ định các gói sử dụng
classes : Định nghĩa các lớp
interfaces : Định nghĩa các Interface
Comments : Các loại ghi chú
- Chỉ có một class hay một Interface được định nghĩa là public. Khi đó, tên của class hay interface đó phải trùng với tên của file java. (Nói dễ hiểu là tên của file java phải cùng tên với class chứa hàm main() ).
- Mỗi class hay interface khi dịch ra sẽ sinh ra file *.class thuộc vào thư mục của gói.
VD:
-----------------
package lessons.java;
import java.util.*;
import java.io.*;

class C1
{
// variables, methods, inner class
}
public class C2
{
// variables, methods, inner class
}
interface I
{
// Khai báo variables, methods
}
-----------------
Khi biên dịch, sẽ sinh ra file C1.class, C2.class, I.class và cách file này sẽ được chứa trong Folder lessons\java (Nghĩa là nếu file java lưu ớ ổ D: thì khi biên dịch chương trình sẽ tạo ra Folder C:\lesson\java và lưu các file *.class vào. Vì ở trên bạn đã định nghĩa "package lessons.java;")

II - package và import:

- Mỗi package chứa các class và interface.
- Dùng package để tránh trùng tên class hay interface trong các gói.
- Khi ta muốn sủ dụng một class nào đó trong 1 package thì ta phải import vào.
- Các class trong java.lang được import tự động.
VD:
-----------------
package lessons.java.test;
import java.lang.*; // không cần thiết
import java.io.File; // chỉ class File trong gói java.io
import lessons.java.*; // tất cả các class trong lessons.java
-----------------

III - Class - Khai báo lớp:
Cú pháp:
-----------------
class [extends ] [implements [,]…]
{
// Khai báo biến thành viên
// Khai báo phương thức khởi dựng
// Khai báo phương thức thành viên
// Khai báo Inner classes
}
-----------------
Ghi chú: Khai báo lớp với tên , thừa kế từ lớp cha và thực hiện theo các interface , ,…
Mặc định của SuperClass là Object

VI - Khai báo các lớp thành viên:
1. Cú pháp:
-----------------
[=val1][, [=val2]];
-----------------
2. VD:
-----------------
String x, y = “ABC”;
private static final int c = 55; // c là hằng số
-----------------
x, y, c : các biến
private, static, final, {} : modifier
“ABC”, 55 : giá trị khởi tạo


V - Constructor - Khai báo Constructor:

1. Là phương thức được gọi để xây dựng nên đối tượng của class.

2. Khai báo:
-----------------
([arguments]) [throws Exception1[, Exception2]]{…}
-----------------
3. Đặc điểm:
- Trong một class có thể có nhiều constructor khác nhau nhưng phải khác nhau về kiểu danh sách các tham số
- Nếu class không khai báo constructor nào thì constructor mặc định là constructor không tham số. Ngược bắt buộc phải dùng constructor đã khai báo.
- Để gọi một constructor từ một constructor khác ta sử dụng this(tham số phù hợp)

4. Thừa kế:
- Constructor không được thừa kế. Hãy sử dụng super(tham số phù hợp) để gọi constructor của lớp cha.
- Trong một constructor nếu gọi super(…) hay this(…) thì lời gọi này phải xuất hiện đầu tiên trong constructor đó.
- Khi gọi phương thức khởi dựng của lớp con, nếu constructor đó không gọi this(…) hay super(…) thì constructor không tham số của lớp cha tự động được kích hoạt.

5. Ví dụ
public class C1{
int index = 0;
public C1(int index) {this.index = index;}
public void print() {
System.out.println(this.index);}
}

Khởi dựng : C1 c = new C1(15); c.print();

VI - method - Khai báo method:
1. Cú pháp:
([arguments]) [throws Exception1[, Exception2]]{…}

2. Ví dụ:
-----------------
public static long add(int x, int y)
public void readFile(String file) throws FileNotFoundException
-----------------
: public, static
: long, void
: add, readFile
[arguments] : int x, int y, String file
[Exceptions] : FileNotFoundException

VII - Inner class:

1. Inner class bao gồm:
Member class : Các inner class ngang cấp với phương thức, biến thành viên
Anonymous class : Các class nặc danh (không tên)
Local class : các class được định nghĩa trong khồi.

2. Member class được chia thành 2 loại:
- Static inner class
- Non-static inner class

3. Ví dụ:
Class C
{
class IC1{}
static class IC2{}
public void method()
{
IC1 ic1 = new IC1();
}
}

VIII - VD về cấu trúc của 1 class:
class Test
{
public static void main(String[] args)
{
// Khởi dựng để tạo object c
C c = new C(“LT-Aptech”);

// Gọi phương thức add()
System.out.println(c.add(5, 2));

// Tạo object của inner class IC
C.IC ic = c.new IC();

// Gọi phương thức của inner class
ic.display(“Hello”);
}
}

IX - Danh sách các Modifier:
1. Dach sách.

user posted image

2. Cách Modifier truy xuất :
- Modifier truy xuất là các modifier dùng để định nghĩa tính chất truy xuất của class, variable, method.
- Chúng gồm: public , protected , {default} , private.
- Khả năng che dấu tăng dần theo : public -> protected -> {default} ->private

3. Modifier - final:
- final có thể dùng để định nghĩa:

Class : không cho thừa kế class này
Variable : hằng số
Method : không cho phép override ở subclass

- Ví dụ:
final class C{
final int x = 5;
final void method() {
// statements
}
}

4. Modifier - abstract:
- abstract có thể dùng để định nghĩa:

Class : phải được thừa kế mới có thể sử dụng các thành viên của nó.
Method : bắt buộc phải override ở subclass. Method này chỉ định nghĩa mà không viết đầy đủ thân.

- Nếu trong class có một phương thức abstract thì class đó buộc phải là abstract

- Ví dụ:
abstract class C{
abstract void method();

}

5. Modifier - static:

- static có thể dùng để định nghĩa :

Variable : tài nguyên chung cho các instance của cùng 1 process.
Method và Variable : được truy xuất trực tiệp thông qua tên class mà không cần khởi dựng đối tượng.
Block : chứa các biểu thức tác động lên biến static

- Ví dụ:
class C{
static int x = 5, y = 7;
static void method() {
}
static{
x += y+5;
}

}

6. Một số Modifier khác:

- native : định nghĩa cho phương thức được viết mã lệnh trong một ngôn ngữ khác (C chẳn hạn)

- transient : định nghĩa biến không cho phép tuần tự hóa.

- volatile : định nghĩa biến cho phép thay đổi dị bộ trong quá trình thực hiện chương trình, được quan tâm trong môi trường nhiều bộ vi xử lý.

- synchronized : định nghĩa phương thức, khối lệnh cái mà được thực hiện duy nhất tại một thời điểm trong các chương trình đa luồng xử lý (được xét sau).

- Ví dụ

Class C{
native void method();
transient String x = “PHANTOM_NDK”;
synchronized void method1(){…}
C1 c1 = new C1();
synchronized(c1){…}
}
=====================
Qua phần II này, các bạn có thể viết được một file java với các class cơ bản rùi đó. Còn tiếp . . .  


Phần III – Khái niệm về Overloading – Overriding – Interface - Exception

I – Overloading

- Trong một class có thể có nhiều phương thức cùng tên nhưng khác nhau về danh sách tham số (kiểu, số lượng) được gọi là overload.

- Ví dụ:

public void method(int x) {}
public void method(float x) {}
public int method(int y) {} // không hợp lệ

Các lời gọi method(5), method(5f) là khác nhau

II – Overriding
- Nếu lớp con có phương thức giống (tham số và kiểu trả về) phương thức lớp cha được gọi là verride.
- Phương thức override phải có quyền truy xuất >= phương thức bị override
- Phương thức override không được phép quăng loại trừ không hợp lệ đối với phương thức bị override
- Để gọi phương thức bị override của lớp cha ta dùng super.xxx(…) trong đó xxx(…) là tên phương thức.
- Ví dụ:

Class C
{
protected int add(int x, int y) throws IOException{}
}
Class C1 extends C
{
protected int add(int x, int y) throws IOException{} //?
public int add(int x, int y) throws FileNotFoundException{} //? public int add(int x, int y) throws Exception{} //? private int add(int x, int y) throws IOException{} //?
}

III – Interface
- Là bản khai báo các phương thức, biến để class nào thực hiện thì phải viết đầy đủ các phương thức này cũng như trong super interface.

- Khai báo interface:

interface [extends SuperInterface]
{
// Các khai báo phương thức và biến
}

- Thực hiện : sử dụng [implements ]

- Ví dụ 1: class C implements Runnable, Serializable{…}

Runnable, Serializable : là các interface

- Các phương thức trong interface chỉ được phép dùng modifier public để định nghĩa.
- Không như abstract class, interface không cho phép viết một phương thức đầy đủ.
- Một class chỉ thừa kế một class duy nhất nhưng có thể thực hiện nhiều interface khác nhau.
- Nếu bỏ qua một số phương thức nào đó của interface thì class thực hiện phải được khai báo abstract

- Ví dụ 2:

interface ISecurity{
public boolean login(String account, String passworld);
}
interface IBAcount extends ISecurity{
public void guiTien(int money);
public void rutTien(int money);
}
class BankAccount implements IBAccount, Runnable{
public boolean login(String acc, String pass){…} // của ISecurity
public void guiTien(int money){…} // của IBAcount
public void rutTien(int money){…} // của IBAcount public void run(){…} // của Runnable
public void rutTienUSD(int usdMoney){…} // Phương thức mới
}

IV – Exception (LoạI trừ)
- Là lỗi xuất hiện trong quá trình chương trình thực hiện của đoạn code. Nếu không xử lý thì chương trình có thể bị dừng.

- Sau đây là một số loại trừ:
FileNotFoundException : Mở file không có
NullPointerException : Gọi phương thức khi đối tượng null
NumberFormatException : Chuyển chuỗi không phải số sang số
ArrayIndexOutOfBounds : Truy xuất phần tử ngoài phạm vi mảng,…

- Cơ chế bắt loại trừ như sau:

try{
// Code có khả năng xảy ra loại trừ [T]
}
catch(Exception1 e1){
// Xử lý loại trừ Exception1 [E1]
}
..
catch(ExceptionN eN){
// Xử lý loại trừ ExceptionN [EN]
}
finally{
// Xử lý bất chấp có loại trừ hay không [F]
}
// Xử lý sau loại trừ [S]


user posted image

- Quy trình hoạt động:
+ Thực hiện:
. Có loại trừ xảy ra
Có bắt : -> [Ei] -> [F] -> [S]
lKhông bắt : -> [F]
. Không có loại trừ : -> [F] -> [S]
+ Có thể chia loại trừ thành 2 loạI:
Các loại trừ con cháu của RuntimeException chỉ xảy ra trong khi chạy. Vì vậy không yêu cầu phải bắt mà vẫn dịch tốt.
Còn lại : yêu cầu phải bắt mới dịch được

- Ví dụ:

String[] numbers = {“abc”, “123”, “cdf”};
int i = 2;
try{
FileInputStream fis = new FileInputStream(“aaa.txt”);
Integer.parseInt(numbers[i]);
}catch(IOException ioe){
System.out.println(“Lỗi mở file !”);
}catch(NumberFormatException nfe){
System.out.println(“Numbers[“+i+”] không phải số !”);
}finally{
System.out.println(“Xong try-catch rồi !”);
}
System.out.println(“Biến number là số !”);

- Dùng throw new Exception để quăng ra loại trừ

pubic void method(String file) throws IOException{

throw new IOException(“Noi dung exception !”);

}
- Tạo lớp loại trừ mới

class InvalidException extends IOException{
public InvalidException(){
super(“Khong hop le !”);
}
public InvalidException(String msg){
super(msg);
}
}
--------------------  


Phần IV – Giao tiếp lập trình ứng dụng tron nền Java2

I – Java2API

- Là tập thư viên được xây dựng sẳn hỗ trợ người lập trình java tạo ra ứng dụng với các chức năng phong phú một cách dễ dàng.

- Nghiên cứu class/interface trong các gói

java.lang : phổ dụng trong ngôn ngữ lập trình java
java.util : tiện ích có tính năng mạnh
java.awt : hỗ trợ lập trình GUI
java.awt.event : xử lý sự kiện xảy ra trong GUI
java.applet : giúp tạo dựng và quản lý Applet
java.io : xử lý các luồng dữ liệu vào ra
java.util.zip : nén và giải nén dữ liệu

II – Các class trong java.lang

Object : Class cha của tất cả các class
Runtime : Class quản lý môi trường
System : Quản lý thông tin hệ thống
Math : Cung cấp hệ thống hàm toán học
Integer : Class số nguyên
String ,StringBuffer : Classes chuỗi
Class, Field, Method : Quản lý thành viên trong class

II – Các class trong java.util

StringTokenizer : Hỗ trợ rời rạc hóa chuỗi
Date : Quản lý ngày tháng
Vector : Quản lý danh sách
Hashtable : Quản lý từ điển (ánh xạ)
Arrays : Hỗ trợ xử lý mảng
Interface : Collection, List, Set, MapqInterface : SortedMap, SortedSet, ComparatorqInterface : Enumeration, Iterator, IteratorListqClass Collections : Hỗ trợ xử lý tập hợp
More Classes
-----------------------------

Có thể sau khi đọc, bạn sẽ cảm thấy khó hiểu. Điều đó là tất nhiên vì học lập trình thì không thể chỉ học lý thuyết mà điều quan trọng là bạn phải thực hành thật nhiều, phải có niềm say mê và sự tìm tòi.
Nếu bạn chưa nắm nhiều thì cũng không sao, khi qua tới phần thiết kế giao diện (GUI) và sử dụng Frame thì các bạn sẽ thấy nó thực tế hơn và dễ hiểu hơn.
Lúc đó, mình sẽ cho các bạn một số đoạn Code mẫu và mình sẽ giải thích chi tiết tưng dòng lệnh trong đoạn Code, khi ấy các bạn chỉ cần bỏ chút thời gian đọc lại bài có liên quan đến dòng lệnh đó thì các bạn sẽ hiểu thôi.
Thân !


Phần V: GUI – Graphic User Interface
Phần này có lẽ sẽ hấp dẫn hơn các phần trên, đây là phần hướng dẫn các bạn tạo giao diện. Tuy nhiên, sau phần này các bạn chỉ có thể tạo giao diện tương đốI thui, để có một giao diện sắc sảo thì các bạn phảI học Advance Java. Advance Java chắc phảI nhờ BabyWolf thui hi hi.

Để có thể xây dựng được ứng dụng với giao diện thân thiện, trong java bạn cần phải tìm hiểu gói java.awt với các nội dung chính:

- Các phần tử (Component)
- Phần tử chứa (Container)
- Chế độ hiển thị (Layout)
- Hệ thống menu (Menu)
- Điều khiển sự kiện (Event)

I - Các phần tử (Component)

Các phần tử tham gia vào quá trình xây dựng ứng dụng GUI gồm :

Label : Nhãn
TextField : Ô nhập 1 dòng
TextArea : Ô nhập nhiều dòng
Button : Nút nhấn
Choice : Combo Box – chỉ cho phép chọn 1
List : List Box – có thể chọn nhiều
Checkbox : Check Box hoặc radio
ScrollBar : Thanh cuộn
Canvas : Phần tử trống dùng tuỳ biến
CheckboxGroup : Cùng với Checkbox để tạo radio group

1. Phần tử Label (Nhãn).

- Là phần tử chứa nhãn, thường đi kèm với 1 phần tử khác để làm rõ nghĩa phần tử đó.
- Phương thức khởi dựng:

Label()
Label(String text)
Label(String text, int align)

Với align=Label.LEFT|Label.RIGHT|Label.CENTER

- Phương thức:

String getText() : Nhận chuỗi nhãn
void setText(String text) : Thay đổi chuỗi nhãn

2. Phần tử TextField

- TextField là phần tử thể hiện ô nhập 1 dòng
- Phương thức khởi dựng:

TextField(), TextField(int cols), TextField(String text), TextField(String text, int cols)

- Phương thức:

void setEchoChar(char c)
char getEchoChar()
void addActionListener(ActionListener l)
void removeActionListener(ActionListener l)

3. Phần tử TextArea

- TextArea là phần tử thể hiện ô nhập nhiều dòng
- Phương thức khởi dựng:

TextArea()
TextArea(int rows, int cols)
TextArea(String text)
TextArea(String text, int rows, int cols)

- Phương thức:

void append(String str)
void insert(String str, int pos)
void replaceRange(String str, int start, int end)

4. Phần tử Button

- Là phần tử được sử dụng để tạo các nút nhấn.
- Phương thức khởi dựng:

Button()
Button(String text)

- Phương thức:

String getLabel()
void setLabel(String label)
void addActionListener(ActionListener l)
void removeActionListener(ActionListener l)
void setActionCommand(String command)
String getActionCommand()

5. Phần tử Choice

- Là phần tử chỉ cho phép lựa chọn 1.

- Phương thức khởi dựng: Choice()

- Phương thức:

void insert(String item, int index)
void addItem(String item)
String getItem(int index)
int getItemCount()
void select(int pos), select(String str)
int getSelectedIndex(), String getSelectedItem()
void remove(int index), remove(String item),removeAll()
void addItemListener(ItemListener l)
void removeItemListener(ItemListener l)

6. Phần tử List

- Là phần tử chỉ cho phép lựa chọn 1.
- Phương thức khởi dựng:

List()
List(int rows)
List(int rows, boolean multiple)

- Phương thức:

void setMultipleMode(boolean cool.gif
void add(String item), add(String item, int index)
String getItem(int index), int getItemCount()
void select(int index), deselect(int index)
boolean isIndexSelected(int index)
int[] getSelectedIndexes(), String[] getSelectedItems()
void remove(int index), remove(String item), removeAll()

7. Phần tử Checkbox

- Là phần tử được sử dụng trong việc đánh dấu trạng thái.
- Phương thức khởi dựng:

Checkbox()
Checkbox(String label)
Checkbox(String label, boolean state)
Checkbox(String label, boolean state, CheckboxGroup group)
Checkbox(String label, CheckboxGroup, boolean state)

- Phương thức

void setLabel(String label), String getLabel()
boolean getState(), void setState(boolean state)
void setCheckboxGroup(CheckboxGroup g)
CheckboxGroup getCheckboxGroup()
void addItemListener(ItemListener l)
void removeItemListener(ItemListener l)

8. Phần tử CheckboxGroup

- Là class được sử dụng kết hợp cùng checkbox để tạo nhóm radio button.
- Phương thức khởi dựng: CheckboxGroup()
- Phương thức:
Checkbox getSelectedCheckbox()
void setSelectedCheckbox(Checkbox box)

9. Phần tử Canvas

- Là phần tử trống chỉ cung cấp môi trường đồ hoạ để bạn có thể tuỳ biến sinh ra các phần tử có mức độ đồ họa tuỳ thích.
- Phương thức khởi dựng: Canvas ()
- Phương thức : thường sử dụng các phương thức thừa kế từ Component sau:

void setSize(int width, int height)
void addMouseListener(MouseEvent e)
void addMouseMotionListener(MouseEvent e)


Dùng Jbuilder thì hay nhưng hơi năng với lại mình thấy cũng ko cần thiết. Newbie chỉ cần dùng JPadPro là OK rồi. Cái đó cũng dễ xài mà lại nhẹ nên rất thích hợp cho bạn nào mới bắt đầu học.


Qua các phần trên, để các bạn có thể hiểu rõ hơn mình đã viết một chương trình nhỏ nhỏ và Post Source của nó lên để các bạn "mổ xẻ". Đây là Source của chương trình Soan Thảo (giống như Notepad nhưng tất nhiên là không nhiều chức năng như Notepad):
Bạn chép đoạn code và nhớ lưu với tên là "TextEditor.java" (Nhắc lại: Tại sao phải lưu với tên đó?. Vì mình đã nói ở bài trước, tên của file Java phải trùng với tên của Class chứa hàm main() ).
-------------------

CODE
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

class thongTin extends Frame
{
String[] lbl = {"Trinh Soan Thao Van Ban",
    "-------------------",
    "Editor:",
    "Nhom:",
    "Forum:",
    "URL:",
    "PHANTOM_NDK",
    "Thiet Ke Phan Mem",
    "Ky Thuat Cong Nghe",
    "http://ktcn02.com/index.php"};
   
Label[] l = new Label[lbl.length];
Panel p1 = new Panel();
Panel p2 = new Panel();
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();

public thongTin()
{
 setTitle("Information");
 setSize(250,200);
 setResizable(false);
 setLayout(gbl);
 setBackground(Color.pink);
 setForeground(Color.red);

 for(int i=0;i
 {
  l[i] = new Label(lbl[i]);
 
  if(i>=6)
   l[i].setForeground(Color.blue);
 }
 l[0].setFont(new Font("Tahoma",Font.BOLD,16));
 l[0].setForeground(Color.black);
 p1.add(l[0]);
 p2.add(l[1]);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(p1,0,0,1,2);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(p2,1,0,1,2);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[2],2,0,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[3],3,0,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[4],4,0,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[5],5,0,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[6],2,1,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[7],3,1,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[8],4,1,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[9],5,1,1,1);

 show();

 addWindowListener(new WindowAdapter()
 {
  public void windowClosing(WindowEvent e)
  {
   dispose();
  }
 });
}

public void addComponents(Component c,int row,int col,int nrow,int ncol)
{
 gbc.gridy = row;
 gbc.gridx = col;
 gbc.gridheight = nrow;
 gbc.gridwidth = ncol;
 gbl.setConstraints(c,gbc);
 add©;
}
}

public class TextEditor extends MenuBar implements ActionListener
{

// cua so chua menu nay
private Frame frame;

TextArea txa;

// Cac menu trong thanh menu cua frame
static String[] menus = {"File","Format","Info"};

// Cac menu trong menu Format
static String[] format_menus = {"Size","Color"};

// Cac muc trong menu File
static String[] file_MenuItems = {"New","Open","-","Save","Save As...","-","Exit"};

// Cac muc trong menu Size
static String[] size_MenuItems = {"10","12","16","20","24","30","40","50" };

// Cac muc trong menu Color
static String[] color_MenuItems = {"Black","Blue","Cyan","DarkGray","Green","Orange"," Pink","Yellow"};

public TextEditor(Frame frame)
{
 // Cua so chua thanh menu nay
 this.frame = frame;

 // Tao thanh menu
 Menu[] mn = new Menu[menus.length];

 for(int i=0;i
 {
  mn[i] = new Menu(menus[i]);
  add(mn[i]);
 }

 //Tao menu Info va dang ky su kien
 MenuItem inf = new MenuItem("Information");
 mn[2].add(inf);
 inf.addActionListener(this);

 // Them cac menu vao menu Format
 Menu[] mnf = new Menu[format_menus.length];
 for(int i=0;i
 {
  mnf[i] = new Menu(format_menus[i]);
  mn[1].add(mnf[i]);
 }

 // Them cac muc vao menu File
 addMenuItems(mn[0], file_MenuItems);

 // Them cac muc vao menu Size
 addMenuItems(mnf[0], size_MenuItems);

 // Them cac muc vao menu Color
 addMenuItems(mnf[1], color_MenuItems);

 frame.add(txa = new TextArea());

}

// Phuong thuc them cac muc (MenuItem) vao menu (Menu)
void addMenuItems(Menu menu, String[] items)
{
 for(int i=0;i
 {
  MenuItem mi = new MenuItem(items[i]);
  if(items[i].equals("-"))
  {
   menu.addSeparator();
  }
  else
  {
   menu.add(mi);
  }
 
  // Dang ky xu ly su kien cho muc trong menu nay
  mi.addActionListener(this);
 }
}

//Xay dung phuong thuc save
void save(String s, String FileName )
{
 try
 {
  FileOutputStream os = new FileOutputStream(FileName);
  for(int i=0;i
  {
   os.write(s.charAt(i));
  }
  os.close();
 }
 catch(IOException e)
 {
 }
}

//Xay dung phuong thuc load
void load(String FileName)
{
 try
 {
  FileInputStream is = new FileInputStream(FileName);
  int n=is.available();
  byte ibuf[] = new byte[n];
  is.read(ibuf,0,n);
  is.close();
  txa.setText(new String(ibuf));
 }
 catch(IOException e)
 {
 }
}

//Xay dung phuong thuc theo yeu cau cua ActionListener
public void actionPerformed(ActionEvent e)
{
 String ac = e.getActionCommand();
 if(ac.equals("Open"))
 {
  FileDialog f= new FileDialog(frame, "Mo File" ,FileDialog.LOAD);
  f.show();
  if(f.getFile() != null)
  {
   load(f.getDirectory() + "" + f.getFile());
  }
 }
 else if(ac.equals("Save")||ac.equals("Save As..."))
 {
  FileDialog f= new FileDialog(frame, "Luu File" ,FileDialog.SAVE);
  f.show();
  if(f.getFile() != null)
  {
  save(txa.getText(),f.getDirectory() + "" + f.getFile());
  }
 }
 else if(ac.equals("New"))
   {
    txa.setText("");
    txa.setFont(new Font("Tahoma",Font.PLAIN,12));
    txa.setForeground(Color.black);
   }
 else if(ac.equals("Exit"))
   System.exit(0);
 else if(ac.equals("Information"))
   {
    thongTin ttn = new thongTin();
   }
 else if(ac.equals("10"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,10));
 else if(ac.equals("12"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,12));
 else if(ac.equals("16"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,16));
 else if(ac.equals("20"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,20));
 else if(ac.equals("24"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,24));
 else if(ac.equals("30"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,30));
 else if(ac.equals("40"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,40));
 else if(ac.equals("50"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,50));
 else if(ac.equals("Black"))
   txa.setForeground(Color.black);
 else if(ac.equals("Blue"))
   txa.setForeground(Color.blue);
 else if(ac.equals("Cyan"))
   txa.setForeground(Color.cyan);
 else if(ac.equals("DarkGray"))
   txa.setForeground(Color.blue);
 else if(ac.equals("Green"))
   txa.setForeground(Color.green);
 else if(ac.equals("Orange"))
   txa.setForeground(Color.orange);
 else if(ac.equals("Pink"))
   txa.setForeground(Color.pink);
 else if(ac.equals("Yellow"))
   txa.setForeground(Color.yellow);  
}

public static void main(String[] args)
{
 Frame f = new Frame("Java Text Editor Application");
 f.setMenuBar(new TextEditor(f));
 f.setSize(500,400);
 f.setFont(new Font("Tahoma",Font.PLAIN,12));
 f.show();

 // Dang ky xu ly su kien dong cua so Frame
 f.addWindowListener(new WindowAdapter()
 {
  public void windowClosing(WindowEvent e)
  {
   System.exit(0);
  }
 });
}
}


------------------------
Mọi thắc mắc xin cứ nói, mình sẽ giải thích ngay.
Thân !

(Lưu ý: Vì ở đây không canh lề được như trong trình soạn Java nên các bạn sẽ nhìn thấy lộn xôn, các bạn Copy về rùi chỉnh ra vô cho hợp lý).

Qua các phần trên, để các bạn có thể hiểu rõ hơn mình đã viết một chương trình nhỏ nhỏ và Post Source của nó lên để các bạn "mổ xẻ". Đây là Source của chương trình Soan Thảo (giống như Notepad nhưng tất nhiên là không nhiều chức năng như Notepad):
Bạn chép đoạn code và nhớ lưu với tên là "TextEditor.java" (Nhắc lại: Tại sao phải lưu với tên đó?. Vì mình đã nói ở bài trước, tên của file Java phải trùng với tên của Class chứa hàm main() ).
-------------------

CODE
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

class thongTin extends Frame
{
String[] lbl = {"Trinh Soan Thao Van Ban",
    "-------------------",
    "Editor:",
    "Nhom:",
    "Forum:",
    "URL:",
    "PHANTOM_NDK",
    "Thiet Ke Phan Mem",
    "Ky Thuat Cong Nghe",
    "http://ktcn02.com/index.php"};
   
Label[] l = new Label[lbl.length];
Panel p1 = new Panel();
Panel p2 = new Panel();
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();

public thongTin()
{
 setTitle("Information");
 setSize(250,200);
 setResizable(false);
 setLayout(gbl);
 setBackground(Color.pink);
 setForeground(Color.red);

 for(int i=0;i
 {
  l[i] = new Label(lbl[i]);
 
  if(i>=6)
   l[i].setForeground(Color.blue);
 }
 l[0].setFont(new Font("Tahoma",Font.BOLD,16));
 l[0].setForeground(Color.black);
 p1.add(l[0]);
 p2.add(l[1]);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(p1,0,0,1,2);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(p2,1,0,1,2);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[2],2,0,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[3],3,0,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[4],4,0,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[5],5,0,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[6],2,1,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[7],3,1,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[8],4,1,1,1);
 gbc.fill=GridBagConstraints.BOTH;
 addComponents(l[9],5,1,1,1);

 show();

 addWindowListener(new WindowAdapter()
 {
  public void windowClosing(WindowEvent e)
  {
   dispose();
  }
 });
}

public void addComponents(Component c,int row,int col,int nrow,int ncol)
{
 gbc.gridy = row;
 gbc.gridx = col;
 gbc.gridheight = nrow;
 gbc.gridwidth = ncol;
 gbl.setConstraints(c,gbc);
 add©;
}
}

public class TextEditor extends MenuBar implements ActionListener
{

// cua so chua menu nay
private Frame frame;

TextArea txa;

// Cac menu trong thanh menu cua frame
static String[] menus = {"File","Format","Info"};

// Cac menu trong menu Format
static String[] format_menus = {"Size","Color"};

// Cac muc trong menu File
static String[] file_MenuItems = {"New","Open","-","Save","Save As...","-","Exit"};

// Cac muc trong menu Size
static String[] size_MenuItems = {"10","12","16","20","24","30","40","50" };

// Cac muc trong menu Color
static String[] color_MenuItems = {"Black","Blue","Cyan","DarkGray","Green","Orange"," Pink","Yellow"};

public TextEditor(Frame frame)
{
 // Cua so chua thanh menu nay
 this.frame = frame;

 // Tao thanh menu
 Menu[] mn = new Menu[menus.length];

 for(int i=0;i
 {
  mn[i] = new Menu(menus[i]);
  add(mn[i]);
 }

 //Tao menu Info va dang ky su kien
 MenuItem inf = new MenuItem("Information");
 mn[2].add(inf);
 inf.addActionListener(this);

 // Them cac menu vao menu Format
 Menu[] mnf = new Menu[format_menus.length];
 for(int i=0;i
 {
  mnf[i] = new Menu(format_menus[i]);
  mn[1].add(mnf[i]);
 }

 // Them cac muc vao menu File
 addMenuItems(mn[0], file_MenuItems);

 // Them cac muc vao menu Size
 addMenuItems(mnf[0], size_MenuItems);

 // Them cac muc vao menu Color
 addMenuItems(mnf[1], color_MenuItems);

 frame.add(txa = new TextArea());

}

// Phuong thuc them cac muc (MenuItem) vao menu (Menu)
void addMenuItems(Menu menu, String[] items)
{
 for(int i=0;i
 {
  MenuItem mi = new MenuItem(items[i]);
  if(items[i].equals("-"))
  {
   menu.addSeparator();
  }
  else
  {
   menu.add(mi);
  }
 
  // Dang ky xu ly su kien cho muc trong menu nay
  mi.addActionListener(this);
 }
}

//Xay dung phuong thuc save
void save(String s, String FileName )
{
 try
 {
  FileOutputStream os = new FileOutputStream(FileName);
  for(int i=0;i
  {
   os.write(s.charAt(i));
  }
  os.close();
 }
 catch(IOException e)
 {
 }
}

//Xay dung phuong thuc load
void load(String FileName)
{
 try
 {
  FileInputStream is = new FileInputStream(FileName);
  int n=is.available();
  byte ibuf[] = new byte[n];
  is.read(ibuf,0,n);
  is.close();
  txa.setText(new String(ibuf));
 }
 catch(IOException e)
 {
 }
}

//Xay dung phuong thuc theo yeu cau cua ActionListener
public void actionPerformed(ActionEvent e)
{
 String ac = e.getActionCommand();
 if(ac.equals("Open"))
 {
  FileDialog f= new FileDialog(frame, "Mo File" ,FileDialog.LOAD);
  f.show();
  if(f.getFile() != null)
  {
   load(f.getDirectory() + "" + f.getFile());
  }
 }
 else if(ac.equals("Save")||ac.equals("Save As..."))
 {
  FileDialog f= new FileDialog(frame, "Luu File" ,FileDialog.SAVE);
  f.show();
  if(f.getFile() != null)
  {
  save(txa.getText(),f.getDirectory() + "" + f.getFile());
  }
 }
 else if(ac.equals("New"))
   {
    txa.setText("");
    txa.setFont(new Font("Tahoma",Font.PLAIN,12));
    txa.setForeground(Color.black);
   }
 else if(ac.equals("Exit"))
   System.exit(0);
 else if(ac.equals("Information"))
   {
    thongTin ttn = new thongTin();
   }
 else if(ac.equals("10"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,10));
 else if(ac.equals("12"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,12));
 else if(ac.equals("16"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,16));
 else if(ac.equals("20"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,20));
 else if(ac.equals("24"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,24));
 else if(ac.equals("30"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,30));
 else if(ac.equals("40"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,40));
 else if(ac.equals("50"))
   txa.setFont(new Font("Tahoma",Font.PLAIN,50));
 else if(ac.equals("Black"))
   txa.setForeground(Color.black);
 else if(ac.equals("Blue"))
   txa.setForeground(Color.blue);
 else if(ac.equals("Cyan"))
   txa.setForeground(Color.cyan);
 else if(ac.equals("DarkGray"))
   txa.setForeground(Color.blue);
 else if(ac.equals("Green"))
   txa.setForeground(Color.green);
 else if(ac.equals("Orange"))
   txa.setForeground(Color.orange);
 else if(ac.equals("Pink"))
   txa.setForeground(Color.pink);
 else if(ac.equals("Yellow"))
   txa.setForeground(Color.yellow);  
}

public static void main(String[] args)
{
 Frame f = new Frame("Java Text Editor Application");
 f.setMenuBar(new TextEditor(f));
 f.setSize(500,400);
 f.setFont(new Font("Tahoma",Font.PLAIN,12));
 f.show();

 // Dang ky xu ly su kien dong cua so Frame
 f.addWindowListener(new WindowAdapter()
 {
  public void windowClosing(WindowEvent e)
  {
   System.exit(0);
  }
 });
}
}


------------------------
Mọi thắc mắc xin cứ nói, mình sẽ giải thích ngay.
Thân !
 

Phần V: GUI – Graphic User Interface (Tiếp Theo)

II – Phần Tử Chứa (Container)
Container là các component có thể chứa các phần tử khác. Chúng còn cung cấp một môi trường đồ hoạ để bạn có thể vẽ lên đó. Java cung cấp các container các mục đích khác nhau sau:

Frame : Cửa sổ gồm tiêu đề, icon và border
Panel : Chỉ để nhóm các component khác
Applet : Chứa các phần tử hiển thị trên trang web
Dialog : Cửa sổ đàm thoại
FileDialog : Cửa sổ giao tiếp file trên đĩa
ScrollPane : Chứa phần tử có kích thước lớn

1. Frame
Khái niệm:
Là các cửa sổ độc lập gồm tiêu đề, icon và border. Là container duy nhất cho phép chứa menu. Layout mặc định là BorderLayout.

Phương thức khởi dựng:
Frame( )
Frame(String title)

Phương thức:
Image getIconImage(), void setIconImage(Image image)
String getTitle(), void setTitle(String title)
MenuBar getMenuBar(), void setMenuBar(MenuBar mb)
void remove(MenuComponent m)
boolean isResizable(), void setResizable(boolean resizable)

2. Panel
Khai niem:
Là một container với mục địch chỉ để nhóm các component. Bạn không thể nhìn thấy container này một cách trực tiếp.

Phương thức khởi dựng : Panel()

Phương thức : sử dụng lại các phương thức của lớp cha (Container).
add(Component)
remove(Component)
validate(),…

3. Dialog
Khai niem:
Là của sổ đàm thoại không chứa menu, được sinh ra từ một của sổ chủ.

Phương thức khởi dựng:
Dialog(Frame owner)
Dialog(Frame owner, boolean modal)
Dialog(Frame owner, String title)
Dialog(Frame owner, String title, boolean modal)

Phương thức:
void setTitle(String title), String getTitle()
void show(), void hide()
void setModal(boolean b), boolean isModal()
void setResizable(boolean resizable), boolean isResizable()

4. FileDialog
Khai niem: Là của sổ giao tiếp file trên đĩa, con của class Dialog.

Phương thức khởi dựng :
FileDialog(Frame owner)
FileDialog(Frame owner, String title)
FileDialog(Frame owner, String title, int mode)
Trong đó mode = FileDialog.LOAD|FileDialog.SAVE

Phương thức:
void setMode(int mode), int getMode()
void setDirectory(String dir), String getDirectory()
String getFile(), void setFile(String file)

[b]5. CrollPane

Khai niem:
Là container với các thanh cuộn nó cho phép chứa được các phần tử lớn hơn phạm vi của nó.

Phương thức khởi dựng: ScrollPane()

Phương thức:
void setScrollPosition(int x, int y)
void setScrollPosition(Point p)
Point getScrollPosition()

(Còn tiếp . . .)

Phần V: GUI – Graphic User Interface (Tiếp Theo)

III – Các Chế Độ Hiện Thị
Bao gồm các chế độ hiện thị sau:
- FlowLayout
- BorderLayout
- GridLayout
- GridBagLayout (*)
- CardLayout
(*) : Tương đốI khó so vớI các chế độ khác.

1. FlowLayout
Khái niệm: Các component được thêm vào nối tiếp nhau khi container dùng chế độ hiển thị này.

Khởi dựng :
FlowLayout(int align, int hgap, int vgap)
FlowLayout(int align)
FlowLayout()

Các tham số :
align : canh lề (mặc định FlowLayout.CENTER) . Có giá trị : FlowLayout.LEFT, FlowLayout.RIGHT, FlowLayout.CENTER
vgap : k/c đứng giữa các component (mặc định 5)
hgap : k/c ngang giữa các component (mặc định 5)

Ví dụ : new FlowLayout(FlowLayout.LEFT, 8, 8)

2. BorderLayout
Khai niem:
Các component được thêm vào 5 vị trí cố định khi container dùng chế độ hiển thị này. 5 vị trí đó gồm:
- BorderLayout.NORTH hay “North”
- BorderLayout.SOUTH hay “South”
- BorderLayout.EAST hay “East”
- BorderLayout.WEST hay “West”
- BorderLayout.CENTER hay “Center”

Khởi dựng :
BorderLayout(int hgap, int vgap)
BorderLayout()

Các tham số :
vgap : k/c đứng giữa các component (mặc định 0)
hgap : k/c ngang giữa các component (mặc định 0)
Ví dụ : Panel p = new Panel();
p.setLayout(new BorderLayout(8, 8))
p.add(new Label(“Password”), BorderLayout.NORTH)

3. GridLayout
Khái niệm:
Mỗi component được thêm vào sẻ chứa trong 1 ô lưới khi container dùng chế độ hiển thị này. Kích thước của các component trong các ô luôn luôn bằng nhau:
Khởi dựng :
GridLayout(int rows, int cols, int hgap, int vgap)
GridLayout(int rows, int cols)

Các tham số :
vgap : k/c đứng giữa các component (mặc định 0)
hgap : k/c ngang giữa các component (mặc định 0)

Ví dụ : Panel p = new Panel();
p.setLayout(new GridLayout(3, 5));
p.add(com1); p.add(com2); p.add(com3);

4. CardLayout
Khai niệm: Container dùng chế độ hiển thị này để điều khiển sắp lớp của các container khác.

Khởi dựng : CardLayout()

Các phương thức :
show(Container parent, String name)
first(Container parent)
previous(Container parent)
next(Container parent)
last(Container parent)

Ví dụ :
CardLayout cl = new CardLayout()
Panel p = new Panel();p.setLayout(cl);
p.add(“c1”, con1); p.add(“c2”, con2); p.add(“c3”, con3);
cl.show(p, “c3”); // hiển thị container con3

5. GridBagLayout
Khái niệm:
Là chế độ hiển thị ô lưới với các đặc tính mạnh.
- Mỗi component trong 1 ô
- Cho phép thêm component vào ô bất kỳ
- Cho phép gộp các ô lại với nhau,…

Khởi dựng : GridBagLayout()

Ví dụ :
GridBagLayout gb = new GridBagLayout()
Panel p = new Panel();p.setLayout(gb);
p.add(“c1”, constraints);
Trong đó : constraints là đối tượng của GridBagConstraints

GridBagConstraints:
Là đối tượng được sử dụng để định nghĩa các ràng buộc đối với component được thêm vào container sử dụng chế độ hiển thị GridBagLayout.
Khởi dựng : GridBagConstraints()
Các biến thành viên được sử dụng để định nghĩa sự ràng buộc như sau :


---------------
Còn tiếp ... 

IV – Điều khiển sự kiên & Menu.
1. Sự kiện xảy ra do
- Người sử dụng tác động lên các conponent của giao diện
- Hệ thống phát sinh.
- Mục tiêu của bài học là khai thác các sự kiện
+ ActionEvent là sự kiện xảy ra khi Click vào button, Chọn mục menu, Nháy kép vào List
+ ItemEvent là sự kiện xảy ra khi chọn vào các mục của các component: Choice, List, Checkbox, Radio
+ MouseEvent xảy ra khi phát sinh các hành động của chuột : click, press, release, move, drag, nter, exit
+ KeyEvent xảy ra khi phát sinh các hành động của bàn phím
Để điều khiển một sự kiện nào dó cần tuân thủ các bước sau:
- Thực hiện các listener interface phù hợp
- Đăng ký xử lý sự kiện cho các component
- Viết code điều khiển sự kiện của các phương được khai báo bởi các listener interfac

2. Menu.
.setMenuBar(MenuBar)
MenuBar class
.add(Menu)
Menu class




.add(MenuItem)
.addSeparator()
MenuItem class
.addActionListener(ActionListener)
  Sau khi mình giới thiệu về Event (Ở trên) thì phần Core Java đến đây có thể coi như là hoàn thành. Tuy nhiên, đây chỉ là cơ bản thôi, nếu bạn muốn tìm hiểu chi tiết hơn thì các bạn có thể tra cứu qua bộ API của Java.
Mình sẽ lập tức soạn ra một số đoạn code demo (code mẫu) tập trung xử lýmột số sự kiên và giao diện với Button, Checkbox, Textield, List ... rồi Post lên cho các bạn tham khảo.
Thân ! Các bạn có thể xem các đoạn Code mẫu tại:
http://www.ktcn02.com/index.php?showtopic=...t=0&#entry51723
Thân !

Các bạn có thể xem các đoạn Code mẫu tại:
http://www.ktcn02.com/index.php?showtopic=...t=0&#entry51723
or
http://www.khkt.net/khkt/index.php?showtop...t=0&#entry51723

Thân !

Các bạn tham khảo thêm: Tự học Java theo cách đơn giản
http://www.vn4000.com/content/view/4228/35/






View Post

0 nhận xét:

Đăng nhận xét

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Best WordPress Web Hosting