Tôi đã sử dụng phương pháp Java TableCellRenderer
truyền thống để cung cấp các trình kết xuất trong một scala.swing.Table
nơi tôi khai báo các bộ hiển thị của mình trên bảng TableColumnModel
. Mã này trông giống như:Các bộ hiển thị tế bào bảng trong Scala
val myTable = new Table {
lazy val tcm = initColumnModel
peer.setColumnModel(tcm)
override
protected def rendererComponent(sel: Boolean, foc: Boolean, row: Int, col: Int) = {
//GET THE VALUE FROM THE TableModel
val value = model.getValueAt(
peer.convertRowIndexToModel(row),
peer.convertColumnIndexToModel(col))
//GET THE RENDERER FROM THE ColumnModel
val renderer = tcm.getColumn(col).getCellRenderer
//WRAP IN A COMPONENT
Component.wrap(renderer.getTableCellRendererComponent(
peer,
value,
sel,
foc,
row,
col).asInstanceOf[JComponent])
}
}
Đáng tiếc là điều này dường như có một rò rỉ bộ nhớ - có lẽ vì tôi đang tạo ra một trường hợp phần mới cho mỗi tế bào trong bảng (cho ~ hàng 30k). Chắc chắn khi tôi thay thế bảng scala của mình bằng một số JTable
(sử dụng chính xác các cột và dữ liệu) rò rỉ bộ nhớ của tôi biến mất.
Câu hỏi của tôi là do đó, loại mã nào mọi người sử dụng khi ghi đè phương pháp rendererComponent
giả sử một người có trình kết xuất ô của riêng mình?
Tôi nghĩ rằng bạn muốn 'peer.convertColumnIndexToModel (col) 'thay vì' peer.convertColumnIndexToModel (hàng) ' –
Bạn cũng có thể sử dụng' scala.swing.Table.viewToModelColumn (Int): Int'. Lưu ý chắc chắn lý do tại sao không có phương thức trình bao bọc tương đương cho các hàng .. –