JavaFX学习之TreeView

阅读更多
  这段代码是从网上看到的,开始自己写一个目录结构的时候,写的好麻烦。首先我开始时读父目录结构,然后点击展开事件的时候读取该子目录结构,其中遇到了许多问题。虽然写出来了,但是乱七八糟。看了下面这段代码,发现自己还是对类不了解。
package ui;

import java.io.File;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.stage.Stage;
import javafx.util.Callback;

public class TestTreeView extends Application{
	
	
	ImageView iv = new ImageView(new Image(getClass().getResourceAsStream("folder_16.png")));
	public static void main(String args[]){
		launch();
	}

	@Override
	public void start(Stage stage) throws Exception {
		HBox box = new HBox();
		buildTree(box);
		stage.setScene(new Scene(box,400,800));
		stage.show();
	}
	
	public void buildTree(HBox box){
		File file = new File("C:/");
		TreeView treeView = new TreeView(new MyTreeItem(file));
		treeView.setCellFactory(new Callback, TreeCell>() {
			
			@Override
			public TreeCell call(TreeView arg0) {
				return new TreeCell(){

					@Override
					protected void updateItem(File f, boolean empty) {
						// TODO Auto-generated method stub
						super.updateItem(f, empty);
						if(empty){
							setText(null);
							setGraphic(null);
						}else{
							setText(f.getName());
							if(f.isDirectory()){
								setGraphic(iv);
							}else if(f.isFile()){
							setGraphic(null);

                                                                }else if(f.getName().endsWith("txt")){
								setStyle("-fx-font-weight:BOLD");
							}else{
								setStyle("-fx-text-fill:#cccccc");
							}
						}
					}
				};
			}
		});
		box.getChildren().add(treeView);
		HBox.setHgrow(treeView, Priority.ALWAYS);
	}
}

class MyTreeItem extends TreeItem{
	private boolean notInitialized = true;
	public MyTreeItem(final File file){
		super(file);
	}
	@Override
	public ObservableList> getChildren(){
		if(notInitialized){
			notInitialized = false;
			if(getValue().isDirectory()){
				for(final File file:getValue().listFiles()){
					super.getChildren().add(new MyTreeItem(file));
				}
			}
		}
		return super.getChildren();
	}
	@Override
	public boolean isLeaf(){
		return !getValue().isDirectory();
	}
	
}

展示树重写了TreeItem的2个方法:
getChildren(); 在展开的时候会去获取子节点,对每一个file进行一次是否有子文件判断,notInitialized即是做一次判断。有子文件,便遍历new TreeItem,并且加到该节点children里面。
isLeadf; 用于判断该节点是否是叶子节点,叶子节点没有展开箭头。

重写CellFactory方法,是对节点的内容进行改变。当cell里面的内容改变时,调用该方法。empty这个boolean是指该cell有没有与与数据关联,因为在扩大页面的时候,那些新显示出来的cell是没有值联系的,所以当为true时,赋值为null。

CheckBoxTreeItem有些已经帮你写的TreeItem,就不必要自己构造了。

展示的时候出了点问题,那个文件图片显示的有点不对,没发现为什么了,代码里面明明没有做,可是显示了,希望能找出来。
后来我又加了一个判断就没出现
else if(f.isFile()){							setGraphic(null);
}


这里有很多javafx的小游戏,一个高手写的
http://lustrezhang.gotoip4.com/fxgame/

这里有个javafx学习的中文网站,我把内容都丢那上面去了。
http://www.jfxee.com/
  • JavaFX学习之TreeView_第1张图片
  • 大小: 711 Bytes
  • 查看图片附件

你可能感兴趣的:(javafx,TreeView)