前面已經(jīng)把樹的基本使用、樹的事件和樹的數(shù)據(jù)取得寫完了,并看了一個(gè)Sun提供的最簡單的樹的例子,這一專題我們講兩個(gè)方面,一個(gè)是使用樹的Renderer和Editor構(gòu)造一棵我們自己的樹;一個(gè)樹使用SwingWorker完成一棵資源管理器樹的加載.
先看渲染的例子:
我們?yōu)槲覀兊臉湓黾恿丝捎门c否、可見與否和節(jié)點(diǎn)圖片的屬性,當(dāng)然你也可以自己添加想要的屬性,比如順序等.
整個(gè)實(shí)現(xiàn)的過程很清晰,也不復(fù)雜,我們首先實(shí)現(xiàn)我們自己的TreeNode,它繼承于DefaultMutableTreeNode,我們?cè)诶锩嫣砑幼约旱膶傩?/span>;然后是實(shí)現(xiàn)樹的節(jié)點(diǎn)的Renderer和Editor,在Renderer里我們?cè)O(shè)置可用也否,選擇狀態(tài),節(jié)點(diǎn)圖片等;在Editor里我們?cè)O(shè)置樹的容器布局.最后構(gòu)造樹時(shí)使用setRenderer和setEditor就可以了,需要注意的是如果僅僅是呈現(xiàn),設(shè)置Renderer就可以了,如果除了呈現(xiàn)還有操作的話,必須都要設(shè)置.
先看我們自己的TreeNode類, 繼承于DefaultMutableTreeNode,
/**
* the tree node that I rewrite it.
*/
publicclass MyTreeNode extends
DefaultMutableTreeNode {
我們添加了屬性:
/** is
select or not. */
privatebooleanisSelected = false;
節(jié)點(diǎn)的選擇狀態(tài)
/** is
enable. */
privatebooleanenabled = false;
節(jié)點(diǎn)使用與否
/** is
visible or not. */
privatebooleanisVisible = false;
節(jié)點(diǎn)可見與否
/** it's
icon. */
private Icon icon = null;
/** icon
name. */
private String iconName = null;
節(jié)點(diǎn)圖片和圖片名字
然后是構(gòu)造函數(shù),我們初始化屬性,或使用默認(rèn)的:
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);
}
然后就是一些設(shè)置和取得屬性的方法,這個(gè)類就相當(dāng)于一個(gè)Bean.
然后就是Rnederer了,我們這里繼承于DefaultTreeCellRenderer
publicclass MyTreeRenderer extends
DefaultTreeCellRenderer {
然后復(fù)寫它的getTreeCellRendererComponent方法:
@Override
public Component getTreeCellRendererComponent(JTree
tree, Object value, boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
然后設(shè)置節(jié)點(diǎn)的屬性:
首先是顯示文本:
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 {
因?yàn)槲覀兪褂玫氖?/span>JLabel作為顯示控件,所以我們的主要實(shí)現(xiàn)是布局處理,對(duì)于事件可以不需要考慮.我們復(fù)習(xí)了DefaultTreeCellEditor的默認(rèn)布局:
/**
*
Container responsible for placing the editingComponent.
*/
privateclass MyEditorContainer extends
DefaultTreeCellEditor.EditorContainer
{
復(fù)寫它的doLayout方法:
@Override
publicvoid doLayout() {
取得節(jié)點(diǎn)的邊緣和大小:
r = tree.getBounds(r);
eSize.width = r.width - (offset * n);
editingComponent.setLocation(offset, 0);
設(shè)置節(jié)點(diǎn)的位置和大小:
setSize(new Dimension(eSize.width + offset, cSize.height));
最后就是使用了,很簡單和以前一樣,直接使用JTree的設(shè)置方法就可以了:
MyTreeRenderer renderer = new MyTreeRenderer();
tree.setCellRenderer(renderer);
tree.setEditable(true);
tree.setCellEditor(new
MyCellEditor(tree,
(DefaultTreeCellRenderer) tree.getCellRenderer()));