Я пытаюсь создать текстовый редактор для моего первого проекта программы.У меня есть дерево с левой стороны и вкладка справа.На вкладке есть текстовая область.Мое намерение состоит в том, чтобы отобразить содержимое файла, выбранного в древовидном представлении, если это файл, для текстовой области.Звучит достаточно просто, верно?
Я пытался весь день заставить это работать, и я не могу понять это.Что-то не так, и это выше моего уровня квалификации.Любой совет приветствуется.Спасибо всем, что вы помогаете сделать эту фантастическую образовательную платформу!
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
testing.txt
TetraGrammaton.iml
Единственные файлы, которые открываются в текстовой области, которая находится на вкладке, - это 2 файла, testing.txt и TetraGrammaton.iml.Другие каталоги открываются при нажатии, но не открываются в текстовой области.