Thứ Bảy, 4 tháng 5, 2013

Cách sử dụng Jtable trong Java – How to use tables in Java



Sử dụng Jtable trong Java

Với lớp Jtable các bạn có thể hiển thị dữ liệu với dạng bảng, mặt khác còn cho phép người dùng chỉnh sửa dữ liệu, Jtable không chứ dữ liệu hoặc cache dữ liệu, nó chỉ lại một đơn thuần là một khuôn nhìn dữ liệu của các bạn. Dưới đây là hình minh họa một bảng với việc sử dụng scroll pane.

Tạo một bảng đơn giản

Bảng trong SimpleTableDemo.java khai báo các tên cột dưới dạng một mảng kiểu String (String array)

String[] columnNames = {“First Name”,
Last Name”,
“Sport”,
“# of Years”,
“Vegetarian”};

Dữ liệu trong mảng này được khởi tạo với một mảng đối tượng 2 chiểu (two-dimensional Object array)
Object[][] data = {
{“Kathy”, “Smith”,
“Snowboarding”, new Integer(5), new Boolean(false)},
{“John”, “Doe”,
“Rowing”, new Integer(3), new Boolean(true)},
{“Sue”, “Black”,
“Knitting”, new Integer(2), new Boolean(false)},
{“Jane”, “White”,
“Speed reading”, new Integer(20), new Boolean(true)},
{“Joe”, “Brown”,
“Pool”, new Integer(10), new Boolean(false)}
};

Sau đó bảng được xây dựng với dữ liệu của data và tền cột columnNames
JTable table = new JTable(data, columnNames);

Có 2 hàm khởi tạo của Jtable mà nhận trực tiếp dữ liệu đó là :
* JTable(Object[][] rowData, Object[] columnNames)
* JTable(Vector rowData, Vector columnNames)

Những điểm thuận lợi của 2 hàm khởi tạo trên là chúng được sử dụng một các để dàng, tuy nhiên chúng vận có những khuyết điểm :
- Các ô mặc định được cài đặt là cho phép chỉnh sửa (editable)
- Tất cả các kiểu dữ liệu là giống nhau, tất cả đều được đưa về kiểu chuỗi. Ví dụ, nếu cột trong bảng có kiểu dữ liệu là Boolean, bảng có thể hiển thị dữ liệu trong một hộp kiểm tra (check box). Tuy nhiên, nếu bạn sử dụng một trong hai hàm khởi tạo JTable được liệt kê ở trên, dữ liệu Boolean của bạn được hiển thị như một chuỗi. Bạn có thể thấy sự khác biệt này trong cột Vegetarian của bảng ví dụ trên.
- Yêu cầu các bạn phải đặt tất cả dữ liệu trong một array hoặc một vertor, điều này sẽ không thích hợp trong một số trường hợp. Ví dụ, nếu bạn khởi tạo một tập các đối tượng từ cơ sở dữ liệu, bạn có thể muốn truy vấn các đối tượng trực tiếp cho các giá trị của họ, hơn là sao chép tất cả các giá trị vào một mảng hoặc vector.
–> Để khắc phục được vấn đề này các bạn có thể tham khảo tại “Creating a Table Model”, sẽ được đề cặp ở các phần sau.

Dưa bảng vào Container

Đây là một đoạn code đơn giản giúp tạo scroll pane xem như là Container của bảng
JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true);

Hai đoạn mã trên dùng để làm các công việc sau :
- Hàm khởi tạo của JScrollPane có tham số là bảng, nó sẽ tạo ra một JScrollPane đồng thời tự động thêm bảng vào JScrollPane.
- JTable.setFillsViewportHeight được gọi để thiết lập thuộc tính fillsViewportHeight. Khi giá trị này là TRUE tức là sử dụng toàn bộ chiều cao của container, ngay cả khi bảng không có đủ hàng để sử dụng toàn bộ không gian dọc. và sẽ tạo ra thành cuộn để người dùng có thể để dàng thao tác
Scroll pane tự độn đặt tiêu đề của bảng ở trên cùng, ngay cả khi chúng ta kéo thanh cuộn xuống dưới, tiêu đề của bảng vẫn luôn luôn được nhìn thấy.

Cài đặt và thay đổi độ rộng của cột

Mặc địch, độ rộng của các cột trong jtable là bằng nhau, ngay cả khi có sự tác động của người dùng, thay đỗi độ rộng của các cột, các cột cũng sẽ được thay đổi tương ứng
Để thay đổi độ rộng mặc định của cột, bạn cần sử dụng hàm setPreferredWidth cho từng cột trên bảng của các bạn. Ví dụ thêm đoạn code sau vào SimpleTableDemo để tăng chiểu rộng của cột thứ 3 lơn hơn các cột còn lại.
TableColumn column = null;
for (int i = 0; i < 5; i++) {
column = table.getColumnModel().getColumn(i);
if (i == 2) {
column.setPreferredWidth(100); //cột thứ 3 sẽ rộng hơn
} else {
column.setPreferredWidth(50);
}
}

Cách cập nhật dữ liệu trên Jtable:

Đầu tiên fải thiết đặt lại dữ liệu:
public void setData(Object[][] newData) {
data = newData;
fireTableDataChanged();
}

Và để JTable không bị biến đổi hình dạng sau khi cập nhật dữ liệu thì fải thiết đặt lại cho JTable:
dataTable.setModel(tableModel);

Tham khảo nâng cao thêm ^^

http://download.oracle.com/javase/tutorial/uiswing/components/table.html#fire

0 nhận xét:

Đăng nhận xét