Netbeans - Mẫu JTable có thanh cuộn(scroll) và thay đổi chiều dài của cột đầu tiên.(JTable with autoresize, horizontal scrolling and shrinkable first column)


Trong bài viết Netbeans - Mô tả công dụng của các thông số AutoResizeMode Properties của JTable, tôi từng trình để sử dụng được JTable có kèm theo thanh cuộn(scroll) thì bắt buộc phải sử dụng thông số AutoResizeMode: OFF.




Nhưng khi dùng thông số này nếu kích thước của bảng nhỏ hơn JPanel sẽ tạo thành vùng trống, tuy về mặt lý thuyết thì không có vấn đề gì nhưng về mặt giao diện thì có thể chúng ta sẽ không thích lắm. Bài viết này sẽ đưa ra một giải pháp đơn giản để giải quyết vấn đề trên.

Đầu tiên khi ta sử dụng thông số AutoResizeMode: OFF thì khi kích thước của bảng nhỏ hơn JPanel thì sẽ tạo nên một vùng trống như hình bên dưới.


Để có thể JTable tự đông lấp đầy khoảng trống khi kích thước của bảng nhỏ hơn JPanel ta làm  như sau:

1. Chọn vùng bảng cần xử lý và click chuột(mouse) phải(right) chọn Customize Code.


2. Trông cửa sổ Customize Code chọn tới dòng "jTable1 = new javax.swing.JTable();" và bên góc trái của của số chuyển default code thành custom creation.


Tiếp theo sửa đoạn mã của vùng code JTable vừa chọn như sau:
jTable1 = new javax.swing.JTable(){
    private boolean inLayout;

    @Override
    public boolean getScrollableTracksViewportWidth() {
        return hasExcessWidth();

    }


    @Override
    public void doLayout() {
        if (hasExcessWidth()) {
            // fool super
            autoResizeMode = AUTO_RESIZE_SUBSEQUENT_COLUMNS;
        }
        inLayout = true;
        super.doLayout();
        inLayout = false;
        autoResizeMode = AUTO_RESIZE_OFF;
    }


    protected boolean hasExcessWidth() {
        return getPreferredSize().width < getParent().getWidth();
    }

    @Override
    public void columnMarginChanged(ChangeEvent e) {
        if (isEditing()) {
            // JW: darn - cleanup to terminate editing ...
            removeEditor();
        }
        TableColumn resizingColumn = getTableHeader().getResizingColumn();
        // Need to do this here, before the parent's
        // layout manager calls getPreferredSize().
        if (resizingColumn != null && autoResizeMode == AUTO_RESIZE_OFF
                && !inLayout) {
            resizingColumn.setPreferredWidth(resizingColumn.getWidth());
        }
        resizeAndRepaint();
    }

};
//Srouce: stackoverflow.com


Khi thêm đoạn code trên vào bạn phải thêm 2 thư viện sau:
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableColumn;

Sau khi build chương trình ta sẽ được kết quả như sau:


Và tất nhiều khi bạn thay đổi kích thước của column khiến cho kích thước bảng lơn hơn JPanel thì thanh cuộn(scroll) sẽ có hiệu lực.
















No comments:

Post a Comment