View Javadoc
1   package edu.jiangxin.apktoolbox.swing.treetable;
2   
3   import java.awt.Component;
4   import java.awt.Graphics;
5   import java.io.Serial;
6   
7   import javax.swing.JTable;
8   import javax.swing.JTree;
9   import javax.swing.table.TableCellRenderer;
10  import javax.swing.tree.TreeModel;
11  
12  
13  public class MyTreeTableCellRenderer extends JTree implements TableCellRenderer {
14      @Serial
15      private static final long serialVersionUID = 1L;
16  
17      /** Die letzte Zeile, die gerendert wurde. */
18      protected int visibleRow;
19  
20      private MyTreeTable treeTable;
21  
22      public MyTreeTableCellRenderer(MyTreeTable treeTable, TreeModel model) {
23          super(model);
24          this.treeTable = treeTable;
25      }
26  
27      // in case of escape of "this"
28      public void initialize() {
29          // Setzen der Zeilenhoehe fuer die JTable
30          // Muss explizit aufgerufen werden, weil treeTable noch
31          // null ist, wenn super(model) setRowHeight aufruft!
32          setRowHeight(getRowHeight());
33      }
34  
35      /**
36       * Tree und Table muessen die gleiche Hoehe haben.
37       */
38      public void setRowHeight(int rowHeight) {
39          if (rowHeight > 0) {
40              super.setRowHeight(rowHeight);
41              if (treeTable != null && treeTable.getRowHeight() != rowHeight) {
42                  treeTable.setRowHeight(getRowHeight());
43              }
44          }
45      }
46  
47      /**
48       * Tree muss die gleiche Hoehe haben wie Table.
49       */
50      public void setBounds(int x, int y, int w, int h) {
51          super.setBounds(x, 0, w, treeTable.getHeight());
52      }
53  
54      /**
55       * Sorgt fuer die Einrueckung der Ordner.
56       */
57      public void paint(Graphics g) {
58          g.translate(0, -visibleRow * getRowHeight());
59  
60          super.paint(g);
61      }
62  
63      /**
64       * Liefert den Renderer mit der passenden Hintergrundfarbe zurueck.
65       */
66      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
67          if (isSelected)
68              setBackground(table.getSelectionBackground());
69          else
70              setBackground(table.getBackground());
71  
72          visibleRow = row;
73          return this;
74      }
75  }