1 package edu.jiangxin.apktoolbox.swing.treetable; 2 3 import javax.swing.JTree; 4 import javax.swing.event.TreeExpansionEvent; 5 import javax.swing.event.TreeExpansionListener; 6 import javax.swing.table.AbstractTableModel; 7 import javax.swing.tree.TreePath; 8 import java.io.Serial; 9 10 public class MyTreeTableModelAdapter extends AbstractTableModel { 11 @Serial 12 private static final long serialVersionUID = 1L; 13 14 JTree tree; 15 transient MyAbstractTreeTableModel treeTableModel; 16 17 public MyTreeTableModelAdapter(MyAbstractTreeTableModel treeTableModel, JTree tree) { 18 this.tree = tree; 19 this.treeTableModel = treeTableModel; 20 21 tree.addTreeExpansionListener(new TreeExpansionListener() { 22 public void treeExpanded(TreeExpansionEvent event) { 23 fireTableDataChanged(); 24 } 25 26 public void treeCollapsed(TreeExpansionEvent event) { 27 fireTableDataChanged(); 28 } 29 }); 30 } 31 32 33 34 public int getColumnCount() { 35 return treeTableModel.getColumnCount(); 36 } 37 38 public String getColumnName(int column) { 39 return treeTableModel.getColumnName(column); 40 } 41 42 public Class<?> getColumnClass(int column) { 43 return treeTableModel.getColumnClass(column); 44 } 45 46 public int getRowCount() { 47 return tree.getRowCount(); 48 } 49 50 protected Object nodeForRow(int row) { 51 TreePath treePath = tree.getPathForRow(row); 52 return treePath.getLastPathComponent(); 53 } 54 55 public Object getValueAt(int row, int column) { 56 return treeTableModel.getValueAt(nodeForRow(row), column); 57 } 58 59 public boolean isCellEditable(int row, int column) { 60 return treeTableModel.isCellEditable(nodeForRow(row), column); 61 } 62 63 public void setValueAt(Object value, int row, int column) { 64 treeTableModel.setValueAt(value, nodeForRow(row), column); 65 } 66 }