/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.jdesktop.swingx.ux; import java.awt.BorderLayout; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTree; import javax.swing.tree.TreePath; import org.gsonformat.intellij.entity.FieldEntity; import org.gsonformat.intellij.entity.ClassEntity; import org.jdesktop.swingx.renderer.CellContext; import org.jdesktop.swingx.renderer.ComponentProvider; import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode; /** * * @author vearn */ public class CheckTreeCellProvider extends ComponentProvider<JPanel> { private CheckTreeSelectionModel selectionModel; private TristateCheckBox _checkBox = null; private JLabel _label = null; public CheckTreeCellProvider(CheckTreeSelectionModel selectionModel) { this.selectionModel = selectionModel; _checkBox = new TristateCheckBox(); // 创建一个TristateCheckBox实例 _checkBox.setOpaque(false); // 设置TristateCheckBox不绘制背景 _label = new JLabel(); // 创建一个JLabel实例 } @Override protected void format(CellContext arg0) { // 从CellContext获取tree中的文字和图标 JTree tree = (JTree) arg0.getComponent(); DefaultMutableTreeTableNode node = (DefaultMutableTreeTableNode) arg0.getValue(); Object obj = node.getUserObject(); if(obj instanceof FieldEntity){ _label.setText(((FieldEntity) obj).getKey()); _checkBox.setSelector((FieldEntity) obj); }else if(obj instanceof ClassEntity){ _label.setText(((ClassEntity) obj).getClassName()); _checkBox.setSelector((ClassEntity) obj); } // _label.setIcon(arg0.getIcon()); // 根据selectionModel中的状态来绘制TristateCheckBox的外观 TreePath path = tree.getPathForRow(arg0.getRow()); if (path != null) { if (selectionModel.isPathSelected(path, true)) { _checkBox.setState(Boolean.TRUE); } else if (selectionModel.isPartiallySelected(path)) { _checkBox.setState(null); // 注意“部分选中”状态的API } else { _checkBox.setState(Boolean.FALSE); } } // 使用BorderLayout布局,依次放置TristateCheckBox和JLabel rendererComponent.setLayout(new BorderLayout()); rendererComponent.add(_checkBox); rendererComponent.add(_label, BorderLayout.LINE_END); } @Override protected void configureState(CellContext arg0) { } /** * 初始化一个JPanel来放置TristateCheckBox和JLabel */ @Override protected JPanel createRendererComponent() { JPanel panel = new JPanel(); return panel; } }