2010-09-12 28 views
15

Sự khác nhau giữa JTable.getModel().getColumnName()JTable.getColumnModel().getColumn(index).getHeaderValue() là gì? Cả hai dường như không chia sẻ bất kỳ dữ liệu nào. Tôi đoán là TableModel.getColumnName() cho biết biểu diễn văn bản của một cột trong khi TableColumn.getHeaderValue()TableColumn.getHeaderRenderer() xác định cột trông như thế nào (không cần văn bản thuần túy).TableModel vs ColumnModel: ai sở hữu giá trị cột?

Điều gì đảm bảo rằng cả hai được giữ đồng bộ? Điều gì sẽ xảy ra nếu hai cuộc xung đột?

Trả lời

27

Trả lời câu hỏi của riêng tôi:

Nếu một JTable được xây dựng với một TableModel nhưng không có một TableColumnModel các JTable sẽ tạo ra một TableColumnModel sử dụng createDefaultColumnModel() và thiết lập autoCreateColumnsFromModel là true. Khi thuộc tính này là true, số JTable sẽ điền số TableColumnModel với các giá trị từ số TableModel.

Không ai có vẻ đảm bảo rằng cả hai được giữ đồng bộ. Trường hợp tại điểm, JTable.getColumnName() sẽ trả lại tên cột TableModel bất kể những gì TableColumnModel thực sự hiển thị trên màn hình.

Một điều thú vị khác mà tôi nhận thấy là TableModel bị giới hạn đối với cột Chuỗi trong khi TableColumnModel cho phép bạn chuyển bất kỳ Đối tượng nào đến số TableCellRenderer. Các Javadoc says rằng các giá trị được giới hạn trong Strings nhưng trên thực tế, điều này là cụ thể cho việc triển khai thực hiện. Không có gì ngăn bạn viết một triển khai sử dụng giá trị JComponent.

Tóm tắt: TableColumnModel là chủ sở hữu cuối cùng của giá trị cột. TableColumnModel chỉ yêu cầu TableModel cho các giá trị chỉ khi giá trị chưa có. Ví dụ: trong trường hợp bạn chuyển một cột vào JTable.addColumn() mà không chỉ định giá trị tiêu đề.

+1

Và bạn có thể đồng bộ hóa chúng với 'JTable.createDefaultColumnsFromModel()' http://download.oracle.com/javase/6/docs/api/javax/swing/JTable.html#createDefaultColumnsFromModel() –

Các vấn đề liên quan