Mục tiêu của Giáo trình Lập trình Java là giúp các bạn hiểu biết về ngôn ngữ lập trình Java, lập trình hướng đối tượng trong Java; trình bày được các mô hình lập trình giao diện, xử lý sự kiện trong Java; trình bày được các bước lập trinh truy xuất cơ sở dữ liệu. Mời các bạn cùng tham khảo!
THIẾT LẬP MÔI TRƯỜNG LẬP TRÌNH JAVA
- Cài đặt được môi trường lập trình Java
- Biên dịch và chạy được một chương trình Java
I/ Cài đặt môi trường lập trình Java
1/ Các phần mềm cần chuẩn bị:
Tải về từ trang web: http://java.sun.com/javase/downloads/index.jsp
Tải về từ trang web: http://www.jcreator.com/download.htm
- Nếu không dùng một IDE nhƣ JCreator để soạn thảo, dịch và thực thi thì ta có thể dùng trình soạn thảo văn bản nhƣ NotePad để soạn thảo
Nên cài đặt theo trình tự sau:
- Thiết lập biến môi trường PATH, CLASPATH
- Thiết lập cho JCreator chỉ vào bộ JDK Doc 1.6 đã cài đặt
- Phần này hướng dẫn cài trong hệ điều hành Windows 7 (đối với các hệ điều hành khác của hãng Microsoft thì cách cài cũng tương tự)
- Tạo thƣ mục C:\Java để cài Nếu không thì để JDK cài ngầm định vào C:\Program Files\Java\jdk1.6.0_11
- Nhấp đúp vào source JDK 1.6 để cài
- Thiết lập biến môi trường PATH chỉ đến thư mục BIN của thư mục mà ta mới cài JDK
Để tối ưu hóa cấu hình môi trường Java, chỉ cần thiết lập biến môi trường CLASSPATH trỏ tới thư mục chứa các lớp của người dùng Từ JDK 1.4 trở đi, việc quản lý đường dẫn lớp được tự động xử lý, nên bạn không còn phải quan tâm đến biến CLASSPATH nữa.
Thiết lập biến môi trường Path
Trong Windows, nhấp Start/run gõ vào sysedit Trong cửa sổ AUTOEXEC.BAT gõ chuỗi “set PATH=“ chỉ đến thƣ mục BIN của JDK mới cài đặt
Ví dụ: set PATH=C:\Program Files\Java\jdk1.6.0_11\bin
Sau đó save và đóng cửa sổ sysedit lại rồi khởi động lại máy
JDK Doc là tài liệu trợ giúp tra cứu các lớp và phương thức của Java, đồng thời hỗ trợ tra cứu hàm và lớp khi soạn thảo trong JCreator Nguồn của JDK Doc được lưu ở dạng file nén và có thể giải nén vào cùng thư mục với nơi bạn cài đặt JDK Sau khi giải nén xong, tiến hành cài đặt JCreator 4.5 để hoàn tất quá trình tích hợp công cụ phát triển.
Sau khi download source JCreator và ta tiến hành cài đặt nó
II/ Biên dịch, chạy chương trình
1/ Viết một chương trình đơn giản
Dùng JCreator viết và thực thi chương trình có tên là HelloWorldApp
Bước 1: Tạo một empty project
Trên menu của JCreator chọn File/New/Project/Empty Project/Next Đặt tên cho project ở ô Name
Chọn thƣ mục chứa project ở ô Location Nhấn Finish
Bước 3: Soạn thảo mã nguồn, dịch và thực thi
Hãy cài đặt môi trường lập trình Java
JAVA CƠ BẢN
- Trình bày được cấu trúc cơ bản của một chương trình viết bằng Java
- Mô tả được hằng và biến dùng trong chương trình
- Sử dụng đƣợc quy tắc cú pháp của ngôn ngữ lập trình
- Vận dụng đƣợc các cấu trúc điều khiển, cấu trúc lặp vào lập trình
- Sử dụng đƣợc mảng và chuỗi trong lập trình Java
I/ Cấu trúc cơ bản một chương trình viết bằng Java
Phương thức main(): là điểm bắt đầu thực thi một ứng dụng
- Mỗi ứng dụng Java phải chứa một phương thức main có dạng như sau: public static void main(String[] args)
- Phương thức main chứa ba bổ từ đặc tả sau:
public: chỉ ra rằng phương thức main có thể được gọi bởi bất kỳ đối tượng nào
static: chỉ ra rằng phương thức main là một phương thức lớp
void: chỉ ra rằng phương thức main sẽ không trả về bất kỳ một giá trị nào
II/ Hằng, biến, kiểu dữ liệu, toán tử, từ khóa
- Từ khóa cho các kiểu dữ liệu cơ bản: byte, short, int, long, float, double, char, boolean
- Từ khóa cho phát biểu lặp: do, while, for, break, continue
- Từ khóa cho phát biểu rẽ nhánh: if, else, switch, case, default, break
- Từ khóa đặc tả đặc tính một method: private, public, protected, final, static, abstract, synchronized
- Hằng (literal): true, false, null
- Từ khóa liên quan đến method: return, void
- Từ khoá liên quan đến package: package, import
- Từ khóa cho việc quản lý lỗi: try, catch, finally, throw, throws
- Từ khóa liên quan đến đối tƣợng: new, extends, implements, class, instanceof, this, super
- Định danh là dùng biểu diễn tên của biến, của phương thức, của lớp
- Trong Java, định danh có thể sử dụng ký tự chữ, ký tự số và ký tự dấu
- Ký tự đầu tiên phải là ký tự chữ, dấu gạch dưới (_), hoặc dấu dollar ($)
- Có sự phân biệt giữa ký tự chữ hoa và chữ thường
Ví dụ: Hello, _prime, var8, tvLang
- Biến là vùng nhớ dùng để lưu trữ các giá trị của chương trình
- Mỗi biến gắn liền với một kiểu dữ liệu và một định danh duy nhất gọi là tên biến
- Tên biến thông thường là một chuỗi các ký tự (Unicode), ký số
- Tên biến phải bắt đầu bằng một chữ cái, một dấu gạch dưới hay dấu dollar
- Tên biến không đƣợc trùng với các từ khóa (xem lại các từ khóa trong java)
- Tên biến không có khoảng trắng ở giữa tên
- Trong java, biến có thể được khai báo ở bất kỳ nơi đâu trong chương trình
;
= ;
- Gán giá trị cho biến
Biến công khai, hay còn gọi là biến toàn cục, là biến có thể truy cập ở khắp nơi trong chương trình Chúng thường được khai báo bằng từ khóa public hoặc được đặt trong một lớp để mở rộng phạm vi truy cập Việc sử dụng biến toàn cục cho phép các thành phần trong ứng dụng dễ dàng trao đổi dữ liệu, nhưng cũng làm phức tạp quản lý trạng thái và tiềm ẩn các rủi ro về an toàn Vì vậy, nên cân nhắc khi dùng biến công khai và ưu tiên hạn chế phạm vi truy cập khi không cần thiết để tối ưu hóa bảo mật và bảo trì mã nguồn.
- Biến cục bộ: là biến chỉ có thể truy xuất trong khối lệnh nó khai báo
4/ Kiểu dữ liệu (data type)
Gồm các kiểu dữ liệu sau:
• Kiểu dữ liệu cơ sở (Primitive data type)
• Kiểu dữ liệu tham chiếu hay dẫn xuất (reference data type)
• Kiểu dữ liệu cơ sở của Java bao gồm các nhóm sau: số nguyên, số thực, ký tự, kiểu luận lý (logic)
Reference data types, also called object data types, store references to objects rather than primitive values Examples include String, Byte, Character, Double, Boolean, Integer, Long, Short, Font, and numerous user-defined classes, all of which play a central role in object-oriented languages for representing text, numbers, booleans, fonts, and other complex data structures.
- Kiểu dữ liệu cơ sở
• Bốn kiểu số nguyên khác nhau là: byte, short, int, long
• Kiểu mặc định của các số nguyên là kiểu int
• Không có kiểu số nguyên không dấu
• Không thể chuyển biến kiểu int và kiểu boolean nhƣ trong ngôn ngữ C/C++
Ví dụ: int x = 0; long y0; int a=1,b,c;
• Kiểu float có kích thước 4 byte và giá trị mặc định là 0.0f
• Kiểu double có kích thước 8 byte và giá trị mặc định là 0.0d
• Khai báo và khởi tạo giá trị cho các biến kiểu dấu chấm động:
• Biểu diễn các ký tự trong bộ mã Unicode
• 2 16 = 65536 ký tự khác nhau : từ '\u0000' đến '\uFFFF'
• Hai giá trị: true hoặc false
• Giá trị mặc định: false
• Không thể chuyển thành kiểu nguyên và ngƣợc lại
= (kiểu_dữ_liệu) ;
Ví dụ: float fNum = 2.2; int iCount = (int) fNum
• Ép kiểu rộng (widening conversion): từ kiểu nhỏ sang kiểu lớn (không mất mát thông tin)
• Ép kiểu hẹp (narrow conversion): từ kiểu lớn sang kiểu nhỏ (có khả năng mất mát thông tin)
- Hằng là một giá trị bất biến trong chương trình
- Tên hằng đƣợc đặt theo qui ƣớc giống nhƣ tên biến
- Hằng ký tự: là một ký tự đơn nằm giữa 2 dấu nháy đơn
- Hằng chuỗi: là tập hợp các ký tự đƣợc đặt giữa hai dấu nháy kép “” Một hằng chuỗi không có ký tự nào là một hằng chuỗi rỗng
>= So sánh lớn hơn hay bằng
Ví dụ: int x = 10; int y = 20; int Z = (x= 0 ? circleRadius:0 );
} public double getRadius() // Lấy bán kính của đường tròn
} public double area() // Tính diện tích đường tròn Circle
{ return Math.PI * radius * radius;
} public String toString() // Biểu diễn đường tròn bằng một chuỗi
{ return "Center = " + super.toString() + "; Radius = " + radius;
} public String getName() // trả về tên của shape
Lớp Circle là lớp dẫn xuất từ lớp Point, và một đường tròn có thể tích là 0.0 Vì vậy, phương thức volume() của lớp cha không được ghi đè ở Circle; Circle thừa kế volume() từ Point, trong khi Point thừa kế từ Shape Cấu trúc kế thừa này cho phép Circle tận dụng các phương thức có sẵn từ Shape và Point mà không cần triển khai lại volume().
Diện tích đường tròn khác với một điểm, vì vậy phương thức tính diện tích area() đƣợc khai báo chồng
Phương thức getName() hiện thực phương thức trừu tượng đã khai báo ở lớp cha Nếu lớp Circle không khai báo getName() hoặc không ghi đè phương thức này, nó sẽ kế thừa từ lớp Point.
Phương thức setRadius dùng để gán một bán kính mới cho đối tượng đường tròn, còn phương thức getRadius trả về bán kính hiện tại của đối tượng đó Trong mã nguồn, lớp Cylinder được định nghĩa trong Cylinder.java và Cylinder thừa kế từ lớp Circle, thể hiện bằng khai báo công khai public class Cylinder extends Circle.
{ protected double height; // chiều cao của Cylinder public Cylinder() // constructor không có tham số
// ngầm gọi đến constructor của lớp cha setHeight( 0 );
29 public Cylinder( double cylinderHeight, double cylinderRadius, int xCoordinate,int yCoordinate )
// Gọi constructor của lớp cha super( cylinderRadius, xCoordinate, yCoordinate ); setHeight( cylinderHeight );
} public void setHeight( double cylinderHeight )
{ // Gán chiều cao cho Cylinder height = ( cylinderHeight >= 0 ? cylinderHeight:0 );
} public double getHeight() // Lấy chiều cao của Cylinder
{ return height; } public double area() // Tính diện tích xung quanh của Cylinder
{ return 2 * super.area() + 2 * Math.PI * radius *height; } public double volume() // Tính thể tích của Cylinder
{ return super.area() * height;} public String toString() // Biểu diễn Cylinder bằng một chuỗi
{ return super.toString() + "; Height = " + height;
} public String getName() // trả về tên của shape
Lớp Cylinder kế thừa từ lớp Circle, mở rộng từ hình tròn thành hình trụ 3D Vì diện tích và thể tích của Cylinder khác với của Circle, hai phương thức area() và volume() phải được ghi đè để tính đúng diện tích bề mặt và thể tích cho hình trụ Việc ghi đè hai phương thức này đảm bảo Cylinder có các phép tính riêng phù hợp với đặc điểm hình học của nó, đồng thời duy trì tính kế thừa và tính đóng gói trong thiết kế lớp.
Phương thức getName() là hiện thực của một phương thức trừu tượng được khai báo ở lớp cha; nếu lớp Cylinder không tự khai báo getName(), nó sẽ kế thừa từ lớp Circle Điều này thể hiện cơ chế kế thừa và đa hình của lập trình hướng đối tượng, cho phép Cylinder sử dụng phiên bản getName() đã được Circle triển khai hoặc ghi đè nếu Cylinder tự định nghĩa một phiên bản riêng Khi Cylinder định nghĩa getName(), phiên bản này sẽ ghi đè lên phiên bản của Circle; ngược lại, Cylinder sẽ dùng getName() từ Circle nếu không có định nghĩa riêng.
Phương thức setHeight dùng để gán chiều cao mới cho một đối tượng hình trụ
Còn phương thức getHeight trả về chiều cao của một đối tượng hình trụ
File Test.java dùng để kiểm tra tính kế thừa của Point, Circle, Cylinder với lớp trừu tƣợng Shape import java.text.DecimalFormat; public class Test
{ // Kiểm tra tính kế thừa của các đối tƣợng hình học public static void main( String args[] )
{ // Tạo ra các đối tƣợng hìnhhọc
// Tạo một mảng các đối tƣợng hình học
// arrayOfShapes[ 0 ] là một đối tƣợng Point arrayOfShapes[ 0 ] = point;
// arrayOfShapes[ 1 ] là một đối tƣợng Circle arrayOfShapes[ 1 ] = circle;
// arrayOfShapes[ 2 ] là một đối tƣợng cylinder arrayOfShapes[ 2 ] = cylinder;
// Lấy tên và biểu diễn của mỗi đối tƣợng hình học
String output = point.getName() + ": " + point.toString() + "\n" + circle.getName() + ": " + circle.toString() + "\n" + cylinder.getName() + ": " + cylinder.toString();
// duyệt mảng arrayOfShapes lấy tên, diện tích, thể tích
// của mỗi đối tƣợng hình học trong mảng for ( int i = 0; i < arrayOfShapes.length; i++ )
+ precision2.format( arrayOfShapes[ i ].area() ) +"\nVolume = " + precision2.format( arrayOfShapes[ i ].volume() );
1/ Viết chương trình thực hiện:
- Xây dựng lớp người gồm 2 thuộc tính tên, năm sinh và các phương thức nhập/xuất cho các thuộc tính trên
LẬP TRÌNH GIAO DIỆN
- Trình bày đƣợc các đối tƣợng giao diện trong Java
- Sử dụng đƣợc các thành phần vào thiết kế giao diện trong Java
- Sử dụng đƣợc các đối tƣợng khung chứa
- Sử dụng đƣợc các bộ quản lý trình bày vào thiết kế giao diện trong Java
I/ Giới thiệu thiết kế giao diện trong Java
Thƣ viện hỗ trợ: tập hợp các lớp java cung cấp hỗ trợ thiết kế, xây dựng GUI (Graphic User Interface) là:
AWT viết tắt của Abstract Windowing Toolkit
AWT là tập hợp các lớp Java cho phép chúng ta tạo một GUI
Cung cấp các mục khác nhau để tạo hoạt động và hiệu ứng GUI trong các thƣ viện sau: import java.awt.*; import java.awt.event.*;
2/ Nguyên tắc xây dựng gui
- Lựa chọn một container: Frame, Window, Dialog, Applet,…
- Tạo các control: (buttons, text areas, list, choice, checkbox, )
- Đƣa các control vào vùng chứa
- Sắp xếp các control trong vùng chứa (Layout)
- Thêm các xử lý sự kiện (Listeners)
II/ Các thành phần (Component)
Tất cả các thành phần cấu tạo nên chương trình GUI được gọi là component
- TextFields, Labels, CheckBoxes, TextArea, Button, Choice, List, Scrollbars,…
- Nhãn đƣợc dùng để trình bày một chuỗi văn bản ra màn hình
The Label class provides multiple constructors and mutator methods for creating and configuring a text label in a GUI: public Label() creates an empty label; public Label(String s) creates a label initialized with the given text; public Label(String s, int align) creates a label with text and a specified alignment; The setText(String s) method updates the label’s content, and setAlignment(int align) updates the label’s horizontal alignment These APIs enable flexible label creation and dynamic updates of text and alignment in user interfaces.
Ví dụ: import java.applet.Applet; import java.awt.*; public class DemoLabel extends Applet
{ private Label label; public void init()
Font font = new Font("Courier", Font.BOLD, 20); label = new Label("Thu nghiem voi Label"); label.setFont(font); add(label);
{ showStatus("Noi dung cua Label la: “ + label.getText());
} import java.applet.Applet; import java.awt.*; public class DemoLabel extends Applet
{ private Label label; public void init()
Font font = new Font("Courier", Font.BOLD, 20); label = new Label("Thu nghiem voi Label"); label.setFont(font); add(label);
{ showStatus("Noi dung cua Label la: “ + label.getText());
- Một số phương thức của Button
• Button(String s); // tạo nút nhấn có tên s
• void setLabel(String s); // đổi tên nút
• String getLabel(); // lấy tên nút nhấn
- Để lắng nghe sự kiện nhấn nút ta cần cài đặt giao tiếp ActionListener
Ví dụ: import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class DemoButton extends Applet implements ActionListener
{ private Button blueButton; private Button whiteButton; private Button helloButton; public void init()
{ blueButton = new Button("Blue"); whiteButton = new Button("White"); helloButton = new Button("Hello"); blueButton.addActionListener(this); whiteButton.addActionListener(this); helloButton.addActionListener(this); add(blueButton); add(whiteButton); add(helloButton);
} public void actionPerformed(ActionEvent event)
{ if(event.getSource() == helloButton) javax.swing.JOptionPane.showMessageDialog(this, "Hello !"); else{ if (event.getSource() == blueButton) this.setBackground(Color.BLUE); else if (event.getSource() == whiteButton) this.setBackground(Color.WHITE); repaint();
- Ô văn bản cho phép nhận dữ liệu từ bàn phím trên một dòng
• void setEditable(boolean b); // đặt/tắt chế độ nhập
• void setEchoChar(char c); // đặt kí tự hiển thị
- Đối tƣợng nghe cần cài đặt 2 giao tiếp:
• TextListener: Cài đặt phương thức textValueChanged(); import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class DemoTextField extends Applet implements ActionListener
{ private TextField txtEdit; private TextField txtReadOnly; private TextField txtPass; private final StringPASSWORD = "Java"; public void init()
{ txtEdit = new TextField("Your name here"); txtPass = newTextField(12); txtPass.setEchoChar('*');
37 txtPass.addActionListener(this); txtReadOnly = newTextField("This text is read only"); txtReadOnly.setEditable(false); add(txtEdit); add(txtPass); add(txtReadOnly);
} public void actionPerformed(ActionEvent event)
{ if(txtPass.getText().equals(PASSWORD)) txtReadOnly.setText("Password is valid"); else txtReadOnly.setText("Invalid password !");
- Choice cung cấp khả năng lựa chọn một trong số các hạng mục sẵn có
• void addItem(String s); // thêm item là s
• String getItem(int index);// lấy item có chỉ số index
• String getSeclectedItem(); // trả về item đƣợc chọn
• int getSelectedIndex(); // trả về index của item đƣợc chọn
Java Applet example: the DemoChoice class is an ItemListener that extends Applet and implements the itemStateChanged( ) method to handle item state events The program imports the necessary packages (import java.applet.Applet; import java.awt.*; import java.awt.event.*;) and defines DemoChoice as a class that extends Applet and implements ItemListener, enabling event-driven UI interactions through item state changes triggered by components like Choice or Checkbox.
{ private Choice choice; private TextField txtText;
38 private Font font; public void init()
This snippet builds a simple Java GUI featuring a font-selection drop-down and a non-editable text field A Choice component is created with three items—TimesRoman, Courier, and Helvetica—alongside an item listener to respond to user selections A TextField initialized with the text "Sample Text" and a width of 16 is made non-editable, and its font is initially set to the first item from the Choice (TimesRoman) in plain style at size 12 Finally, both the Choice and the TextField are added to the interface, enabling users to see how the selected font affects the sample text.
} public void itemStateChanged(ItemEvent event)
{ font = newFont(choice.getSelectedItem(), Font.PLAIN, 12); txtText.setFont(font);
5/ Check box (hộp đánh dấu)
- Checkbox cung cấp các hộp tuỳ chọn cho người dùng
• void setLabel(Strings); // đặt nhãn mới
• booleangetState(); // lấy trạng thái hiện tại
- Lớp nghe cài đặt giao tiếp ItemListener và cài đặt phương thức itemStateChanged( ) import java.applet.Applet;
Import java.awt.event.*; public classDemoCheckbox extends Applet implements ItemListener
39 private Checkbox checkBold; private Checkbox checkItalic; privateTextFieldtxtText; public void init()
{ checkBold = new Checkbox("Bold"); checkItalic = new Checkbox("Italic"); checkBold.addItemListener(this); checkItalic.addItemListener(this); txtText = new TextField("Sample Text", 16);
Font font = new Font("Courier", Font.PLAIN, 14); txtText.setFont(font); add(txtText); add(checkBold); add(checkItalic);
} public void itemStateChanged(ItemEvent event)
{ int valBold = Font.PLAIN; int valItalic = Font.PLAIN; if(checkBold.getState()) valBold = Font.BOLD; if(checkItalic.getState()) valItalic = Font.ITALIC;
Font font = new Font("Courier", valBold + valItalic, 14); txtText.setFont(font);
6/ Check box group & Radio button
- Các Checkbox có thể đƣợc đặt trong một CheckboxGroup để tạo ra các Radio Button
// Tạo 3 radio button thuộc cùng một nhóm Ban đầu
// radio1 đƣợc chọn Tại mỗi thời điểm chỉ có thể chọn một // trong 3 radio CheckboxGroupg = new CheckboxGroup();
Checkbox radio1 = new Checkbox(“Radio1”, g, true);
Checkbox radio2 = new Checkbox(“Radio2”, g, false);
Checkbox radio3 = new Checkbox(“Radio3”, g, false);
// Cac import can thiet public class DemoRadio extends Applet implements ItemListener
{ private Checkbox plain, bold, italic; private CheckboxGroup group; private TextFieldtxtText; public void init()
This Java snippet builds a simple UI with a TextField and three mutually exclusive style options A CheckboxGroup ensures only one of Plain, Bold, or Italic can be selected at a time, with Plain pre-selected and Bold and Italic unselected, while each checkbox has an item listener attached for interactive handling The txtText field is initialized with "Sample Text" and uses the Courier font in plain style at size 14 All components—the text field and the three checkboxes—are added to the container, enabling users to switch text styling while the listeners respond to changes.
} public void itemStateChanged(ItemEvent event)
{ int mode = 0; if(event.getSource() == plain) mode = Font.PLAIN; if(event.getSource() == italic) mode = Font.ITALIC; if(event.getSource() == bold) mode = Font.BOLD; txtText.setFont(newFont("Courier", mode, 14));
- List cho phép người dùng chọn một hay nhiều item từ một danh sách các item
• List(); // cấu tử mặc định
• List(int items, boolean ms); // cấu tử mở rộng
• String getSeclectedItem(); // lấy lại thành phần đƣợc chọn
- Lớp nghe cài đặt giao tiếp ItemListener và/hoặc ActionListener
// Cac import can thiet public class DemoList extends Applet implements ItemListener, ActionListener
{ private List colorList; public void init()
{ colorList = newList(3, false); colorList.add("White"); colorList.add("Black"); colorList.add("Yellow"); colorList.add("Green"); colorList.addItemListener(this); colorList.addActionListener(this); add(colorList);
} public void itemStateChanged(ItemEvent event)
List list = (List) event.getSource(); showStatus("Item " + list.getSelectedIndex() + " selected");
} public void actionPerformed(ActionEvent event)
List list = (List) event.getSource();
Strings = list.getSelectedItem(); if(s.equals("White")) setBackground(Color.WHITE); if(s.equals("Black")) setBackground(Color.BLACK); if(s.equals("Yellow")) setBackground(Color.YELLOW); if(s.equals("Green")) setBackground(Color.GREEN); repaint();
III/ Các đối tƣợng khung chứa (Containers)
- Frame đƣợc dùng để xây dựng các ứng dụng GUI chạy độc lập
- Frame là một cửa sổ có thanh tiêu đề và các đường biên Bố cục mặc định của Frame là BorderLayout
- Frame kế thừa từ Window, nó có thể nghe các sự kiện xảy ra trên cửa sổ khi cài đặt giao tiếp WindowListener
- Các ứng dụng độc lập thường tạo ra cửa sổ kế thừa từ lớp Frame
• Frame không có các phương thức init, start… như trong Applet
• Các ứng dụng độc lập dùng Frame phải có hàm main và đƣợc chạytrực tiếp bằng lệnh java
• Cần có lệnh setSize, setVisible(true) để có thể hiển thị Frame
• Ở cuối chương trình nên có lệnh: System.exit(0); import java.awt.*; importjava.awt.event.*; public class DemoFrame
{ public static void main(String[] args)
Frame frame = new Frame(“Example on Frame”);
Labellabel = newLabel("This is a label in Frame",Label.CENTER); frame.add(label, BorderLayout.CENTER); frame.setSize(500,500); frame.setVisible(true); frame.addWindowListener(newMyWindowListener());
// Lop nghe doc lap (external listener)
{ public void windowClosing(WindowEvent event)
- Lớp Panel kế thừa từ Container Nó có thể đƣợc dùng để tạo ra các giao diện theo ý muốn
- Ví dụ: Một giao diện có thể có nhiều panel sắp xếp theo một layout nhất định, mỗi panel lại có các component sắp xếp theo một layout riêng
- Chú ý: Panel có bố cục mặc định là FlowLayout public void init()
Choice choice = new Choice(); choice.add("Red"); choice.add("Green"); choice.add("Blue");
Button ok = new Button("Ok");
Button cancel = new Button("Cancel");
Panel panel = new Panel(); panel.add(ok); panel.add(cancel); this.setLayout(new BorderLayout()); this.add(choice, BorderLayout.NORTH); this.add(panel, BorderLayout.CENTER);
Khung cuộn là một container cho phép chứa thành phần GUI có kích thước lớn hơn chính nó
- Dialog cũng là một cửa sổ, thường dùng để nhập hoặc hiển thị thông tin với người dùng
• Modal: Phải đóng hộp thoại trước khi chuyển sang cửa sổ khác
• Modaless: Có thể giữ nguyên hộp thoại và chuyển sang cửa sổ khác
- Dialog kế thừa từ lớp Window, nó có bố cục mặc định là BorderLayout
- Hộp thoại có thể chứa các thành phần GUI và xử lý các sự kiện nhƣ một cửa sổ bình thường
IV/ Các bộ quản lý trình bày (Layout managers)
1/ Flow layout Đối với một container trình bày theo kiểu FlowLayout thì:
- Các component gắn vào đƣợc sắp xếp theo thứ tự từ trái sang phải và từ trên xuống dưới
- Các component có kích thước như mong muốn
- Nếu chiều rộng của Container không đủ chỗ cho các component thì chúng tự động tạo ra một dòng mới
- FlowLayout thường được dùng để để sắp xếp các button trong 1 panel
- Chúng ta có thể điều chỉnh khoảng cách giữa các component
2/ Border layout Đối với một container trình bày theo kiểu BorderLayout thì: bộ trình bày khung chứa đƣợc chia làm 4 vùng: NORTH, SOUTH, WEST, EAST và CENTER
Đây là một bố cục trình bày năm vùng cho phép sắp xếp và thay đổi kích thước các thành phần bên trong sao cho vừa với Đông, Tây, Nam, Bắc và Trung tâm Bằng cách điều chỉnh vị trí và kích thước một cách linh hoạt, bố cục này tối ưu hóa sự phân chia không gian giữa các vùng và đảm bảo giao diện rõ ràng, cân đối trên nhiều kích thước màn hình Việc tổ chức theo năm vùng Đông, Tây, Nam, Bắc và Trung tâm giúp cải thiện tính trực quan, khả năng thích ứng và tối ưu hóa nội dung cho SEO trên trang.
Không cần phải gắn component vào cho tất cả các vùng
Các component ở vùng NORTH và SOUTH có chiều cao tùy ý nhƣng có chiều rộng đúng bằng chiều rộng vùng chứa
Các component ở vùng EAST và WEST có chiều rộng tùy ý nhƣng có chiều cao đúng bằng chiều cao vùng chứa
Các component ở vùng CENTER có chiều cao và chiều rộng phụ thuộc vào các vùng xung quanh import java.awt.*; class BorderLayoutDemo extends Frame
{ private Button north, south, east, west, center; public BorderLayoutDemo(String sTitle)
In this Java GUI snippet, the component initializes with a title via super(sTitle) and creates five Button objects labeled North, South, East, West, and Center The code then arranges these buttons using a BorderLayout by adding north to BorderLayout.NORTH, south to BorderLayout.SOUTH, east to BorderLayout.EAST, west to BorderLayout.WEST, and center to BorderLayout.CENTER The result is a simple compass-like interface with five labeled buttons positioned around a central control.
} public static void main(String args[])
{ Frame fr = new BorderLayoutDemo ("Border Layout Demo"); fr.pack(); fr.setVisible(true);
3/ Grid layout Đối với một container trình bày theo kiểu GridLayout thì:
- Bộ trình bày tạo một khung lưới vô hình với các ô bằng nhau
Trong Java AWT, GridLayout cho phép các đối tượng được đặt vừa với kích thước từng ô của một lưới, mang lại bố cục đồng nhất và dễ dự đoán Thứ tự sắp xếp diễn ra từ trái sang phải và từ trên xuống dưới, đảm bảo mỗi ô chứa một thành phần có kích thước bằng nhau Để triển khai GridLayout, bạn cần import java.awt.* và tạo ví dụ như lớp GridLayoutDemo, thiết lập bố cục cho container và thêm các thành phần vào lưới theo thứ tự mong muốn Đây là một cách hiệu quả để xây dựng giao diện người dùng dạng lưới trong ứng dụng Java.
{ public static void main(String arg[]) {
This Java code creates a Frame titled "GridLayout Demo" and arranges six components in a 3-by-2 grid using GridLayout(3,2) It adds three buttons labeled Red, Green, and Blue, a checked Checkbox labeled "Pick me," a Label reading "Enter name here:" and a TextField for user input The frame is then packed to fit its components and made visible, resulting in a ready-to-use graphical user interface.
Trong bố trí GridBagLayout, các component được đưa vào container sẽ được sắp xếp trên một khung lưới ảo tương tự GridLayout Tuy nhiên, khác với GridLayout, kích thước của các đối tượng không nhất thiết phải vừa với một ô mà có thể chiếm nhiều ô hơn, như 2 hoặc 3 ô hoặc nhiều ô tùy theo các ràng buộc được xác định bằng GridBagConstraints.
Lớp GridBagConstraints dẫn xuất từ lớp Object Lớp GridBagConstraints dùng để chỉ định ràng buộc cho những components trình bày trong khung chứa container theo kiểu GridBagLayout
- gridx, gridy: vị trí ô của khung lưới vô hình mà ta sẽ đưa đối tượng con vào o gridwidth, gridheight: kích thước hay vùng trình bày cho đối tượng con
- Insets: là một biến đối tƣợng thuộc lớp Inset dùng để qui định khoảng cách biên phân cách theo 4 chiều (trên, dưới, trái, phải)
- weightx, weighty: chỉ định khoảng cách lớn ra tương đối của các đối tượng con với nhau import java.awt.*; public class GridBagLayoutDemo
{ public static void main(String arg[])
Frame f = new Frame("GridBagLayout Demo");
// Tao doi tuong rang buoc cho cach trinh bay
String[] buttName = {"Mot", "Hai", "Ba", "Bon", "Nam", "Sau",
Button[] buttons = new Button[9]; for(int i=0;i Data
- Đặt tên nguồn dữ liệu ở mục “Data Source Name” (sẽ sử dụng trong chuỗi kết nối)
- Nhấp “Select” để chọn đường dẫn đến file cơ sơ dữ liệu
II/ Các bước lập trình truy xuất cơ sở dữ liệu
- Xử lý kết quả trả về
III/ Các đối tƣợng trong lập trình cơ sở dữ liệu
Sử dụng phương thức tĩnh forName() của lớp Class với tham số là tên trình điều khiển cơ sở dữ liệu
Class.forName(“Database driver name”);
System.out.println(“Driver not found: ” +e.getMessage());
System.out.println(“SQL Exception: ” + e.getMessage());
- Trình điều khiển của MySQL:
Class.forName(“org.gjf.mm.mysql.Driver”);
- Trình điều khiển của Oracle:
Class.forName(“oracle.jdbc.driver.OracleDriver”);
- Trình điều khiển của Sybase:
Class.forName("com.sybase.jdbc.SybDriver");
- Trình điều khiển qua cầu nối ODBC:
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
- Để thiết lập kết nối ta gọi phương thức tĩnh getConnection() của lớp DriverManager, khi đó trả về một thể hiện của lớp Connection, theo dạng nhƣ sau:
Connection con = DriverManager.getConnection(dbUrl, username, password);
- Trong đó: dbUrl: là chuỗi kết nối đến cơ sở dữ liệu username: tên người dùng đăng nhập password: mật khẩu đăng nhập Định nghĩa chuỗi kết nối:
String host = “dbhost.yourcompany.com”;
String dbName = “someName”; int port = 1234;
String oracleURL = “jdbc:oracle:thin:@” + host + “:”
String sybaseURL = “jdbc:sybase:Tds:“ + host + “:”
- Sử dụng đối tƣợng Connection để tạo đối tƣợng Statement
- Đối tƣợng này có nhiệm vụ gửi các câu lệnh sql đến CƠ SỞ DỮ LIỆU
- Cùng một đối tƣợng Statement có thể sử dụng cho nhiều câu lệnh sql khác nhau
- Có 3 phương thức thực thi
IV/ Xử lý và trình bày dữ liệu
1/ Tạo bảng qua jdbc public void createTable(){
String sqlQuery = "CREATE TABLE PRICELIST(NAME
VARCHAR(20), PRICE NUMBER);"; if (conn != null){ try{
Statement st = conn.createStatement(); st.execute(sqlQuery); st.close();
2/ Nhập dữ liệu qua jdbc
- Sử dụng phương thức executeUpdate() của Statement để cập nhật dữ liệu qua JDBC
- executeUpdate() trả về số dòng bị ảnh hƣỏng sau khi câu lệnh đƣợc thực thi
Ví dụ: public void insertData(String name, double val){
String insertQuery = "INSERT INTO PRICELIST VALUES
('" + name + "'," + val + ");"; if (conn != null){ try{
Statement st = conn.createStatement(); int d = st.executeUpdate(insertQuery);
System.out.println("So dong duoc cap nhat: " + d);
3/ Đọc dữ liệu từ cơ sở dữ liệu
- Sử dụng phương thức executeQuery() của Statement để đọc dữ liệu từ cơ sở dữ liệu
- Dữ liệu đọc được sẽ được lưu trong ResultSet
- Có thể di chuyển tới lui trong ResultSet để lấy dữ liệu ra
Con trỏ của ResultSet kiểu này chỉ được di chuyển theo một hướng từ đầu đến cuối
Con trỏ có thể di chuyển lùi và tiến tương đối so với vị trí hiện tại, và đồng thời có thể nhảy tới một vị trí xác định bất kỳ; quá trình di chuyển này sẽ không bị ảnh hưởng bởi bất kỳ thay đổi ở các khu vực khác.
Con trỏ có thể di chuyển tới lui tương đối so với vị trí hiện tại của nó và cũng có thể di chuyển đến một vị trí cố định trên màn hình; tuy nhiên, kết quả di chuyển có thể bị ảnh hưởng nếu có sự thay đổi ở nơi khác, khiến hành vi của con trỏ không còn đúng như dự định.
- Các chế độ hoạt động của resultset
Các chế độ hoạt động đồng thời của Resultset:
Xác định chế độ hoạt động đồng thời, kết quả lưu trong đối tượng ResultSet không đƣợc thay đổi
Xác nhận chế độ hoạt động đồng thời, kết quả lưu trong đối tượng ResultSet đƣợc thay đổi
- Các phương thức của resultset
• next(): di chuyển con trỏ đến dòng kế, trả về true nếu có dòng kế tiếp, false nếu đến cuối ResultSet
• previous(): di chuyển con trỏ đến dòng trước
• first(): di chuyển con trỏ đến dòng đầu tiên
• last(): di chuyển con trỏ đến dòng cuối cùng
• beforeFirst(): di chuyển con trỏ đến vị trí trước dòng đầu tiên
• afterLast(): di chuyển con trỏ đến sau dòng cuối cùng
• relative(int rows): di chuyển con trỏ tương đối với vị trí hiện tại của nó với số dòng là rows
• absolute(int row): di chuyển con trỏ đến dòng thứ row
- Lấy dữ liệu từ resultset
• Dùng phương thc getXXX(String colname)
XXX là kiểu dữ liệu đƣợc trả về
colname là tên của cột cần lấy dữ liệu ra
String name = rs.getString("NAME");
double val = rs.getDouble("PRICE");
- Chỉnh sửa dữ liệu bằng resultset
• Dữ liệu của một bảng trong CƠ SỞ DỮ LIỆU có thể đƣợc chỉnh sửa bằng cách sử dụng câu lệnh SQL UPDATE
• Ta cũng có thể chỉnh sửa dữ liệu trên các hàng của một bảng từ ResultSet
• Để làm đƣợc điều này, ResultSet phải đƣợc đặt ở chế độ CONCUR_UPDATABLE
• Sử dụng các phương thức updateXXX() để chỉnh sửa dữ liệu trên ResultSet XXX là kiểu dữ liệu của cột cần đƣợc sửa
- Đóng kết nối Để đóng kết nối ta sử dụng phương thức close của đối tượng connection: connetion.close()
1/ Viết chương trình cho phép quản lý thông tin lớp học
Khi người dùng nhấn nút Display, hệ thống hiển thị thông tin từ bảng ClassTbl vào JTable để người dùng có thể xem dữ liệu lớp học một cách trực quan Đồng thời, nếu người dùng nhập tên lớp vào trường Class name, chương trình sẽ hiển thị thông tin chi tiết của lớp được nhập, hỗ trợ tìm kiếm và xem nhanh các lớp học theo tên.
Chương trình cho phép cập nhật thông tin lớp nhanh chóng bằng cách chọn một dòng trong JTable, nhập thông tin thay đổi tại trường Class Name và nhấn nút lệnh để lưu lại các cập nhật Quá trình này giúp dữ liệu lớp được đồng bộ trên hệ thống và hiển thị đúng trên giao diện người dùng.
69 Để xóa thông tin, người dùng sẽ chọn một dòng muốn xóa tại JTable và chọn nút lệnh “Delete”
Khi người dùng chọn nút lệnh “Insert”, chương trình sẽ hiển thị màn hình thêm thông tin lớp học
2/ Tại màn hình thêm thông tin lớp hớp học
Khi người dùng chọn nút lệnh “Save”, lưu thông tin lớp học
Lưu ý kiểm tra thông tin “Class ID” đã tồn tại hay chưa? Khi người dùng chọn nút lệnh “Close”, quay về màn hình 1.