Blog

JavaFX Filesystem Viewers

JavaFX 8 has 2 controls (=dialogs) to browse the filesystem

  • javafx.stage.DirectoryChooser native_dir
  • javafx.stage.FileChooser native_file

who create native resource dialogs but if you want to integrate a directory view in your application and/or you want custom features like a file preview those dialogs are of no help. I had just this use case and so I implemented 3 different controls:

  • org.eclipse.fx.ui.controls.filesystem.DirectoryTreeView: Display a directory structure as a tree
  • org.eclipse.fx.ui.controls.filesystem.DirectoryView: Display the contents of a directory - currently only a list view is available
  • org.eclipse.fx.ui.controls.filesystem.ResourcePreview: Display preview informations of a file e.g. a thumb for images

If you combine them you get a nice file browser you can integration just anywhere screen_dirview Usage is straight forward:

package org.eclipse.fx.ui.controls.sample;

import java.nio.file.Paths;

import javafx.application.Application;
import javafx.beans.Observable;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.SplitPane;
import javafx.stage.Stage;

import org.eclipse.fx.ui.controls.filesystem.DirectoryTreeView;
import org.eclipse.fx.ui.controls.filesystem.DirectoryView;
import org.eclipse.fx.ui.controls.filesystem.IconSize;
import org.eclipse.fx.ui.controls.filesystem.ResourceItem;
import org.eclipse.fx.ui.controls.filesystem.ResourcePreview;
import org.eclipse.fx.ui.controls.filesystem.RootDirItem;

public class DirectoryViewSample extends Application {

  private static RootDirItem rootDirItem;

  @Override
  public void start(Stage primaryStage) throws Exception {
    rootDirItem = ResourceItem.createObservedPath(
      Paths.get("/Users/tomschindl/Desktop"));

    DirectoryTreeView tv = new DirectoryTreeView();
    tv.setIconSize(IconSize.MEDIUM);
    tv.setRootDirectories(
      FXCollections.observableArrayList(rootDirItem));

    DirectoryView v = new DirectoryView();
    v.setIconSize(IconSize.MEDIUM);

    tv.getSelectedItems().addListener( (Observable o) -> {
      if( ! tv.getSelectedItems().isEmpty() ) {
        v.setDir(tv.getSelectedItems().get(0));
      } else {
        v.setDir(null);
      }
    });

    ResourcePreview prev = new ResourcePreview();
    v.getSelectedItems().addListener((Observable o) -> {
      if( v.getSelectedItems().size() == 1 ) {
        prev.setItem(v.getSelectedItems().get(0));
      } else {
        prev.setItem(null);
      }
    });

    SplitPane p = new SplitPane(tv,v, prev);
    p.setDividerPositions(0.3,0.8);

    Scene s = new Scene(p,500,500);
    primaryStage.setScene(s);
    primaryStage.show();
  }

  public static void main(String[] args) {
    Application.launch(args);
    rootDirItem.dispose();
  }
}
published on
Previous
Introducing XGrid - a toolkit agnostic Grid control and component