JavaFX Icons im TreeView werden nicht angezeigt

Diskutiere Icons im TreeView werden nicht angezeigt im AWT, Swing, JavaFX & SWT Bereich.
ProggersWorld

ProggersWorld

Hallo Zusammen,

mit dem SceneBuilder habe ich eine Anwendung mit einem TreeView erstellt. Funktioniert soweit alles gut. Nun habe ich versucht Icons hinzu zu fügen. Diese werden allerdings nicht angezeigt.
Zuerst wird in der Main Klasse buildTreeView(), der sich in der MainController befindet, aufgerufen:
Java:
MainController mainCtrl = loader.getController();
mainCtrl.buildTreeView();
Der Funktion buildTreeView() sieht wie folgt aus:
Java:
public void buildTreeView() {
    File file = new File(this.prop.getProperty("paths.workspace"));
    ftItem = new FileTreeItem(file);
    expandTreeView(ftItem);
    tvFileList.setRoot(ftItem);
}
    
private void expandTreeView(TreeItem<?> item) {
    if (item != null && !item.isLeaf()) {
        item.setExpanded(true);
        for (TreeItem<?> child : item.getChildren()) {
            expandTreeView(child);
        }
    }
}
Zur guter letzt habe ich im Internet ein FileItemTree-Klasse gefunden und nach meine bedürfnisse angepasst:
Java:
public class FileTreeItem extends TreeItem<File> {

    private boolean isFirstTimeChildren = true;
    private boolean isFirstTimeLeaf = true;
    private boolean isLeaf;
    private boolean isDirectory;
    private String fullPath;

    public static Image folderCollapseImage = new Image("file:src/data/icons/16x16/folder_stand.png");
    public static Image folderExpandImage = new Image("file:src/data/icons/16x16/folder.png");
    public static Image fileImage = new Image("file:src/data/icons/16x16/document_index.png");

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public FileTreeItem(File f) {
        super(f);

        if (f.isDirectory()) {
            this.isDirectory = true;
            this.setGraphic(new ImageView(folderExpandImage));
        } else {
            this.isDirectory = false;
            this.setGraphic(new ImageView(fileImage));
            // if you want different icons for different file types this is where you'd do it.
        }

        this.addEventHandler(TreeItem.branchExpandedEvent(), new EventHandler() {
            @Override
            public void handle(Event event) {
                FileTreeItem source = (FileTreeItem) event.getSource();
                if (source.isDirectory && source.isExpanded()) {
                    ImageView iv = (ImageView) source.getGraphic();
                    iv.setImage(folderExpandImage);
                }
            }
        });

        this.addEventHandler(TreeItem.branchCollapsedEvent(), new EventHandler() {
            @Override
            public void handle(Event event) {
                FileTreeItem source = (FileTreeItem) event.getSource();
                if (source.isDirectory() && !source.isExpanded()) {
                    ImageView iv = (ImageView) source.getGraphic();
                    iv.setImage(folderCollapseImage);
                }
            }
        });
    }
    
    public boolean isDirectory() {
        return (this.isDirectory);
    }

    public String getFullPath() {
        return (this.fullPath);
    }

    @Override
    public ObservableList<TreeItem<File>> getChildren() {
        if (isFirstTimeChildren) {
            isFirstTimeChildren = false;

            super.getChildren().setAll(buildChildren(this));
        }
        return super.getChildren();
    }

    @Override
    public boolean isLeaf() {
        if (isFirstTimeLeaf) {
            isFirstTimeLeaf = false;
            File f = (File) getValue();
            isLeaf = f.isFile();
        }

        return isLeaf;
    }

    private ObservableList<TreeItem<File>> buildChildren(TreeItem<File> TreeItem) {
        File f = TreeItem.getValue();
        if (f != null && f.isDirectory()) {
            File[] files = f.listFiles();
            if (files != null) {
                ObservableList<TreeItem<File>> children = FXCollections.observableArrayList();

                for (File childFile : files) {
                    children.add(new FileTreeItem(childFile));
                }

                return children;
            }
        }

        return FXCollections.emptyObservableList();
    }

}
Irgendwie sehe ich vor lauter Bäume den Wald nicht mehr.
Ich hoffe jemand kann mir ein virtueller Ventilator einschalten damit sich der realler Nebel lichtet. 😉

Im voraus schon mal tausend Dank.

Grüße Raymond
 
ProggersWorld

ProggersWorld

Hallo,

Problem gefunden. In mein Programm war noch ein setCellFactory versteckt. In dieser wird der Dateipfad in Dateiname umgewandelt. Ich habe das ganze um setGraphic() erweitert und nun funktioniert es.
Java:
tvFileList.setCellFactory(new Callback<TreeView<File>, TreeCell<File>>() {
    public TreeCell<File> call(TreeView<File> tv) {
        return new TreeCell<File>() {
            @Override
            protected void updateItem(File item, boolean empty) {
                super.updateItem(item, empty);
                if (empty || item == null) {
                    setText("");
                    setGraphic(null);
                } else {
                    setText(item.getName());
                    if (item.isDirectory()) {
                        setGraphic(new ImageView(folderExpandImage));
                    } else if (item.isFile()) {
                        setGraphic(new ImageView(fileImage));
                    }
                }
            }
        };
    }
});
Grüße Raymond
 
Thema: 

Icons im TreeView werden nicht angezeigt

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben