JavaFX TreeView верхнего уровня работает, но подпапки имеют неправильный каталог? - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь создать текстовый редактор для моего первого проекта программы.У меня есть дерево с левой стороны и вкладка справа.На вкладке есть текстовая область.Мое намерение состоит в том, чтобы отобразить содержимое файла, выбранного в древовидном представлении, если это файл, для текстовой области.Звучит достаточно просто, верно?
Я пытался весь день заставить это работать, и я не могу понять это.Что-то не так, и это выше моего уровня квалификации.Любой совет приветствуется.Спасибо всем, что вы помогаете сделать эту фантастическую образовательную платформу!

import javafx.beans.value.ChangeListener
import javafx.beans.value.ObservableValue
import javafx.fxml.FXML
import javafx.fxml.Initializable
import javafx.scene.control.Tab
import javafx.scene.control.TabPane
import javafx.scene.control.TextArea
import javafx.scene.control.TreeItem
import javafx.scene.control.TreeView
import javafx.scene.control.cell.TextFieldTreeCell
import javafx.stage.FileChooser
import javafx.stage.Window

class Controller implements Initializable{

@FXML
TextArea inputSpace
@FXML
Tab tabName
@FXML
TabPane tabPane
@FXML
TreeView fileTree

void openAndSetTab(File file) throws FileNotFoundException{
    if(file.canRead()){
        def openFile = new Tab()
        tabPane.getTabs().add(openFile)

        //set file name to tab title
        def dotPosition = file.name.indexOf('.')
        def fileName = file.name.substring(0,dotPosition)
        openFile.text = fileName

        //add file data to text area
        def inputArea = new TextArea()
        openFile.setContent(inputArea)
        def data = file?.getText()
        inputArea.setText(data)

        //bring to front
        openFile.getTabPane().getSelectionModel().select(openFile)
    }else{
        println('Cannot read...')
        println(file.absolutePath)
    }
}

void openFile() {
    //get file
    def chooser = new FileChooser()
    def file = chooser.showOpenDialog(Window.getResource('Main.java') as Window)

    openAndSetTab(file)
}

/**
 * save text data to file
 * and set title of tab
 */
void saveFile() {
    FileChooser chooser = new FileChooser()
    def data = inputSpace.text
    def file = chooser.showSaveDialog(Window.getResource('Main.java') as Window)
    if(data != null){
        file.text = ''
        file << data
    }

    //set tab title to saved file name
    int dotPosition = file.name.indexOf('.')
    def fileName = file.name.substring(0,dotPosition)
    tabName.text = fileName
}

/**
 * stackoverflow.com Answer
 * https://stackoverflow.com/questions/38278601/javafx-treeview-directory-listing
 * answered Jul 9 '16 at 6:46
 * Author: fabian
 * Original was using CheckBoxTreeItem, I updated code to my needs
 * @param inputDirectoryLocation
 */
void displayTreeView(String inputDirectoryLocation) {
    def tree = new GetTree()

    // Creates the root item.
    TreeItem<String> rootItem = new TreeItem<>(inputDirectoryLocation)

    // Hides the root item of the tree view.
    fileTree.setShowRoot(false)

    // Creates the cell factory.
    fileTree.setCellFactory(TextFieldTreeCell.forTreeView())

    // Get a list of files.
    def fileInputDirectoryLocation = new File(inputDirectoryLocation)
    List<File> fileList = fileInputDirectoryLocation.listFiles()

    // create tree
    for (File file : fileList) {
        tree.createTree(file, rootItem)
    }

    fileTree.setRoot(rootItem)
}

@Override
void initialize(URL url, ResourceBundle resourceBundle) {
    displayTreeView(System.getProperty('user.dir'))
    fileTree.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem>() {
        @Override
        void changed(ObservableValue<? extends TreeItem> observableValue, TreeItem treeItem, TreeItem t1) {
            def file = new File(t1.value.toString())
            if(file.isFile()){
                openAndSetTab(file)
            }
        }
    })
  }
}

Я добавил к классной баночке заводную баночку, поэтому она выглядит как проводная.Это не суперсет java.Люблю использовать это.Что я делаю не так?

Класс GetTree выглядит следующим образом:

import javafx.scene.control.TreeItem

 /**
 * stackoverflow.com Answer
 * https://stackoverflow.com/questions/38278601/javafx-treeview-directory-listing
 * answered Jul 9 '16 at 6:46
 * Author: fabian
 * Original was using CheckBoxTreeItem, I updated code to my needs
 */
 class GetTree {
 static void createTree(File file, TreeItem<String> parent) {
    if (file.isDirectory()) {
        TreeItem<String> treeItem = new TreeItem<>(file.getName())
        parent.getChildren().add(treeItem)
        for (File f : file.listFiles()) {
            createTree(f, treeItem)
        }
    } else{//must be a file
        parent.getChildren().add(new TreeItem<>(file.getName()))
    }
  }

}

Папка Projects имеет значение

  • tetragrammaton

    • .idea

      -подкаталоги. Здесь

    • out

      -подкаталоги. Здесь

    • src

      • sub-directories.here

    testing.txt

    TetraGrammaton.iml

Единственные файлы, которые открываются в текстовой области, которая находится на вкладке, - это 2 файла, testing.txt и TetraGrammaton.iml.Другие каталоги открываются при нажатии, но не открываются в текстовой области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...