JTree--樹(節點渲染和資源管理器加載)(一)
前面已經把樹的基本使用、樹的事件和樹的數據取得寫完了,并看了一個Sun提供的最簡單的樹的例子,這一專題我們講兩個方面,一個是使用樹的Renderer和Editor構造一棵我們自己的樹;一個樹使用SwingWorker完成一棵資源管理器樹的加載.
先看渲染的例子:


我們為我們的樹增加了可用與否、可見與否和節點圖片的屬性,當然你也可以自己添加想要的屬性,比如順序等.
整個實現的過程很清晰,也不復雜,我們首先實現我們自己的TreeNode,它繼承于DefaultMutableTreeNode,我們在里面添加自己的屬性;然后是實現樹的節點的Renderer和Editor,在Renderer里我們設置可用也否,選擇狀態,節點圖片等;在Editor里我們設置樹的容器布局.最后構造樹時使用setRenderer和setEditor就可以了,需要注意的是如果僅僅是呈現,設置Renderer就可以了,如果除了呈現還有操作的話,必須都要設置.
先看我們自己的TreeNode類, 繼承于DefaultMutableTreeNode,
/**
* the tree node that I rewrite it.
*/
publicclass MyTreeNode extends DefaultMutableTreeNode {
我們添加了屬性:
/** is select or not. */
privatebooleanisSelected = false;
節點的選擇狀態
/** is enable. */
privatebooleanenabled = false;
節點使用與否
/** is visible or not. */
privatebooleanisVisible = false;
節點可見與否
/** it's icon. */
private Icon icon = null;
/** icon name. */
private String iconName = null;
節點圖片和圖片名字
然后是構造函數,我們初始化屬性,或使用默認的:
public MyTreeNode() {
this(null, true, false, true, true, null);
}
public MyTreeNode(Object userObject, boolean allowsChildren,
boolean isSelected, boolean enabled, boolean isVisible, Icon icon) {
super(userObject, allowsChildren);
this.isSelected = isSelected;
this.enabled = enabled;
this.isVisible = isVisible;
this.icon = icon;
setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTI
ON);
}
然后就是一些設置和取得屬性的方法,這個類就相當于一個Bean.
然后就是Rnederer了,我們這里繼承于DefaultTreeCellRenderer
publicclass MyTreeRenderer extends DefaultTreeCellRenderer {
然后復寫它的getTreeCellRendererComponent方法:
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
然后設置節點的屬性:
首先是顯示文本:
String stringValue = tree.convertValueToText(value, sel, expanded, leaf, row, hasFocus);
setText(stringValue);
然后是可用與否:
boolean nodeIsEnabled = ((MyTreeNode) value).isEnabled();
boolean isEnabled = (treeIsEnabled && nodeIsEnabled);
setEnabled(isEnabled);
然后是是圖片
Icon icon = ((MyTreeNode) value).getIcon();
setIcon(icon);
還有一些基本的屬性,比如背景色等:
setForeground(getTextSelectionColor());
再來需要看的類就是Editor了,它繼承于DefaultTreeCellEditor:
publicclass MyCellEditor extends DefaultTreeCellEditor {
因為我們使用的是JLabel作為顯示控件,所以我們的主要實現是布局處理,對于事件可以不需要考慮.我們復習了DefaultTreeCellEditor的默認布局:
/**
* Container responsible for placing the editingComponent.
*/
privateclass MyEditorContainer extends
DefaultTreeCellEditor.EditorContainer {
復寫它的doLayout方法:
@Override
publicvoid doLayout() {
取得節點的邊緣和大小:
r = tree.getBounds(r);
eSize.width = r.width - (offset * n);
editingComponent.setLocation(offset, 0);
設置節點的位置和大小:
setSize(new Dimension(eSize.width + offset, cSize.height));
最后就是使用了,很簡單和以前一樣,直接使用JTree的設置方法就可以了:
MyTreeRenderer renderer = new MyTreeRenderer();
tree.setCellRenderer(renderer);
tree.setEditable(true);
tree.setCellEditor(new MyCellEditor(tree,
(DefaultTreeCellRenderer) tree.getCellRenderer()));
posted on 2010-04-21 21:36 zeyuphoenix 閱讀(2871) 評論(0) 編輯 收藏 所屬分類: JTree的使用