Sunday, May 15, 2005

New NetBeans Resources

Tập hợp khá nhiều tài nguyên về NetBeans 4.1. Check here.

Thursday, May 12, 2005

My First Java Swing Application

Ứng dụng là một cái từ thật là to mặc dù tôi cũng chẳng biết dùng từ gì để chỉ nó nữa. Tôi tạo ra một cái Swing Interface, bắt đầu từ cái JFrame có bố là Frame và ông nội là thằng Window. Nhớ là Frame là một window có thể định lại cỡ, có title bar và có nút tắt, thu nhỏ/phóng to. Tôi sẽ đặt thẳng vào Frame này một nhãn JLabel và một nút JButton theo Layout Manager là Bố cục dòng chảy Flow.


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

public class MyFirstSwingApp {

/**
* Creates a new instance of MyFirstSwingApp
*/
public MyFirstSwingApp() {
createFrame();
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
MyFirstSwingApp Frame = new MyFirstSwingApp();
}

public void createFrame() {
//Create and set up the window.
JFrame frame = new JFrame("HelloWorldSwing Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new FlowLayout());

JButton button = new JButton("It is a Button");
frame.getContentPane().add(button);

JLabel label = new JLabel("This is a Label");
frame.getContentPane().add(label);

frame.pack();
frame.setVisible(true);


}
}



Bây giờ nhiệm vụ của tôi là giở qua một loạt các trang, tìm đến trang nói về sự kiện để thử mở rộng ứng dụng. Tôi muốn khi nút được bấm thì Label sẽ thay đổi.

Sun nói rằng để theo dõi một sự kiện trên một Component như Jbutton thì lớp chứa Component phải thực hiện giao diện ActionListener. Như vậy tôi sẽ phải thay khai báo tên lớp thành:

public class MyFirstSwingApp implements ActionListener {


Thêm nữa, do cái thằng giao diện ActionListener này nằm trong gói java.awt.event.ActionListener nên tớ cần phải nhập thêm một chú import cho phải đạo.

import java.awt.event.*;


Trong giao diện ActionListener có phương thức
addActionListener
mà ta sẽ buộc phải định nghĩa lại (override) trong lớp thực thi giao diện đó không thì trình biên dịch sẽ la lối om sòm là lớp của chú đâu phải là lớp abstract, mà không phải thế thì sao ko định nghĩa lại
addActionListener
cho vui làng xóm. Thế là tớ phải thêm một phương thức nữa cho đẹp cả 2 họ.

public void actionPerformed(ActionEvent e) {

}



Sun bảo là muốn theo dõi sự kiện trên đối tượng/mẫu của Component nào thì cần phải sử dụng phương thức
addActionListener(this)(this)
trên đối tượng của Component đó. Nghĩa là tớ muốn khi người ta bấm nút thì sự kiện đó sẽ được gửi đi ra cho phương thức xử lý
actionPerformed
thì tớ cần dùng
addActionListener(this)
trên đối tượng cụ thể cần theo dõi đó. May quá tớ chỉ có tạo một nút nên tớ chỉ việc thêm dòng:


button.addActionListener(this);


Vậy là khi xuất hiện sự kiện ấn nút thì
actionPerformed
được thực thi liền.

Swing continued

Lần trước mới ngửi qua một chút Swing, lần này có thời gian để nghía lại một tí. Đặc biệt đáng chú ý là cây phân cấp lớp của Swing. Containment hierarchy/Class Hierarchy trong Swing là một khái niệm cần nhớ:




Có lẽ không dễ dàng để nhớ. Nhưng bắt buộc phải nhớ để còn biết cái nào kế thừa từ cái nào và ta có thể dùng những phương thức hay trường nào từ siêu lớp nào.

A Definition on Frame:
A resizable, movable window with title bar and close button. Usually it contains Panels.
Đó chính là lý do mà JFrame kế thừa từ lớp Window trong khi các component khác lại chỉ kế thừa từ siêu lớp của Window là Container.

A definition on Window:
A window without a title bar or move controls. The program can move and resize it, but the user cannot. Free standing Window, not inside any other Window. It must have a parent Frame mentioned in the constructor.
A definition on JPanel:
A region internal to a JFrame or another JPanel. Used for grouping components together. Optionally bounded by a visible border. Lives inside some enclosing Container.
A definition on Container:
These are the basis on which all the other windows are built. They manage the child Components and LayoutManager. They are missing an addNotify method to create the peer object, so can't appear on screen. You don't normally instantiate Containers directly, but some subclass of them.

NetBeans 4.1 Final released

Hôm nay, NetBeans 4.1 đã ra xuất xưởng. Với khả năng hỗ trợ Java 5.0 và J2EE mạnh mẽ, NetBeans sẽ là một trong những winner trên thị trường IDE hiện nay. Mặc dù Eclipse phổ biến hơn nhưng Linux sẽ là mảnh đất đầu tiên mà NetBeans đánh bại Eclipse. Tôi thích Eclipse cho PHP nhưng với Java thì tôi thú NetBeans 4.1 hơn. Hi vọng NetBeans 4.2 sẽ hỗ trợ nhiều ngôn ngữ hơn trong đó có PHP, Groovy. Ngoài ra tôi cũng mong NetBeans 4.2 sẽ hỗ trợ xây dựng UML như của JBuilder 2005.

Wednesday, May 11, 2005

How to use Javadoc in Netbeans 4.1RC2

Javadoc là một tài liệu tham khảo vô giá. Nhiều khi bạn sao chép mã từ đâu đó về để đọc và bất thình lình có một API quái quỷ nào đó xuất hiện mà bạn chẳng hiểu chúng làm cái gì. Nếu đó là các API của J2SDK thì bạn có thể tra cứu trong Java Documentation. NetBeans 4.1 cho bạn sét chúng ngay trong IDE và tìm kiếm API đó bằng việc bôi đen và ấn Shift+F1 (hay thủ công hơn là vào menu Tools -> Javadoc Index Search). Để set:
  • Vào Tools -> Java Platform Manager
  • Nhìn bên phải, vào tab Javadoc và chọn đường dẫn đến nó
Thế còn nếu API đó là của thư viện nào nằm ngoài;
  • Vào Tools -> Library Manager
  • Chọn tab Javadoc như trên
Javadoc Index Search sẽ hiện ra như là một tab bên cạnh tab code mã của bạn.

Monday, May 09, 2005

What dya know on casting

Casting hay chuyển kiểu là một kĩ thuật thường gặp nhưng cần có 2 điểm cần chú ý:
+ Bạn có thể thực hiện chuyển kiểu giữa các primitives types
+ Bạn có thể thực hiện chuyển kiểu giữa các đối tượng dựa trên quan hệ kế thừa
Nếu bây giờ tôi có một kiểu Int là i = 1. Tôi muốn chuyển nó sang kiểu String để thực hiện việc gán nó vào một chuỗi. Bạn không thể làm:
int i=10;
String st= new String();
st=(String)i;
Bạn có thể dùng lớp bao Wrapper class để thực hiện việc chuyển đổi:
String st = Integer.toString(i);
string = String.valueOf(i);
hoặc một tiểu xảo tận dụng khả năng tự chuyển đổi khi kết hợp 1 chuỗi với một số là
st = ""+i;

Multi MySQL servers on the same PC: It is a snap

MySQL thật dễ chịu. Hôm nay tôi thử cài MySQL 4.0 và MySQL 5.0.4 trên Windows Server 2003 mà không có khó khăn gì. Chỉ cần chọn khác cổng TCP/IP là ngon: 3306/3307. Trên SysTray, MySQL báo là có 2 instances đang chạy.

MySQL 4 and MySQL 5 in the same PC. Image Hosted by ImageShack.us