gpt4 book ai didi

java - 从目录选择器获取列表时,如何使用按钮更新 ListView ?

转载 作者:行者123 更新时间:2023-12-02 09:25:08 24 4
gpt4 key购买 nike

嗨,我是一名初学者程序员,我制作了一个带有 ListView 的文本编辑器。

您可以在 TextView 中加载包含文本文件的文件夹。我遇到的问题是,在同一文件夹中保存文件后,我无法更新列表。

我制作了一个用于更新列表的按钮,但无法使其工作。我尝试删除并再次添加列表与 .clear.setAll 但它只是删除列表。 Example of how to program looks like

当您按下“刷新列表”按钮时,有人可以帮助我更新列表吗?

这是我的代码:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.web.HTMLEditor;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import java.io.*;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Main extends Application {

public static void main(String[] args) {
launch(args);
}


@Override
public void start(Stage primaryStage) throws Exception {

//Create list with files
ObservableList files = FXCollections.observableArrayList();
ListView list = new ListView(files);
Button c = new Button("Load Folder");
c.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
DirectoryChooser dc = new DirectoryChooser();
dc.setInitialDirectory(new File(System.getProperty("user.home")));
File choice = dc.showDialog(primaryStage);
if (choice == null || !choice.isDirectory()) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Could not open directory");
alert.setContentText("The file is invalid.");

alert.showAndWait();
}
assert choice != null;
File[] selectedFiles = choice.listFiles();
files.removeAll(files);
files.addAll(selectedFiles);
list.setCellFactory(lv -> new ListCell<File>() {
@Override
protected void updateItem(File file, boolean empty) {
super.updateItem(file, empty);
setText(file == null ? null : file.getName());
}
});
}
});


// MENUS
MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu("File");
Menu help = new Menu("help");

//Menu contents
// Menu FILE
MenuItem newfile = new MenuItem("New");
MenuItem open = new MenuItem("Open");
MenuItem save = new MenuItem("Save");
MenuItem export = new MenuItem("Export to txt");
MenuItem exit = new MenuItem("Exit");

newfile.setAccelerator(new KeyCodeCombination(KeyCode.N, KeyCombination.CONTROL_DOWN));
open.setAccelerator(new KeyCodeCombination(KeyCode.O, KeyCombination.CONTROL_DOWN));
save.setAccelerator(new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN));
export.setAccelerator(new KeyCodeCombination(KeyCode.E, KeyCombination.CONTROL_DOWN));
exit.setAccelerator(new KeyCodeCombination(KeyCode.W, KeyCombination.CONTROL_DOWN));


//Menu HELP
MenuItem about = new MenuItem("About J4hN0te");


//Adding Menus in the box
menuBar.getMenus().addAll(menuFile, help);
menuFile.getItems().addAll(newfile, open, save, export, exit);
help.getItems().addAll(about);


//CREATE TEXTEDITOR
final HTMLEditor htmlEditor = new HTMLEditor();
htmlEditor.setPrefHeight(500);
htmlEditor.setPrefWidth(600);


//SCROLLIST
ScrollPane scrollpane = new ScrollPane();
scrollpane.getStyleClass().add("noborder-scroll-pane");
scrollpane.setContent(htmlEditor);
scrollpane.setFitToHeight(true);


// ABOUT WINDOW
String programName = "J4hN0te";
String version = "1.0 alpha";
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Om programmet");
alert.setHeaderText(programName + " - Version " + version + "\nEtt program skapat i kursen \"Intro Javaprogrammering\"\nYrkesAkademin Sundsvall - HT2019");
alert.setContentText("Vi som gjort programmet är:\n André Pähn \n Fredrik Lax");


// CREATE NEW FILE
newfile.setOnAction(ActionEvent -> {
htmlEditor.setHtmlText("");
});

//OPEN FILE
open.setOnAction(ActionEvent -> {

ArrayList<String> lines = new ArrayList<String>();
FileChooser fc = new FileChooser();
fc.getExtensionFilters()
.addAll(
new FileChooser.ExtensionFilter(".rtf files (*.rtf)", "*.rtf"),
new FileChooser.ExtensionFilter(".html files (*.html)", "*.html"));
File selectedFile = fc.showOpenDialog(null);

try (BufferedReader reader = new BufferedReader(new FileReader(new File(String.valueOf(selectedFile))))) {

String line;
while ((line = reader.readLine()) != null)
lines.add(line);

} catch (IOException e1) {
e1.printStackTrace();
}
lines.forEach(htmlEditor::setHtmlText);
});

// EXPORT FILE TO TXT
export.setOnAction(ActionEvent -> {
FileChooser fc = new FileChooser();
fc.getExtensionFilters()
.addAll(
new FileChooser.ExtensionFilter(".txt files (*.txt)", "*.txt"));
File savefile = fc.showSaveDialog(null);
try {
String htmlString = htmlEditor.getHtmlText();
Pattern pattern = Pattern.compile("<[^>]*>");
Matcher matcher = pattern.matcher(htmlString);
final StringBuffer sb = new StringBuffer(htmlString.length());
while (matcher.find()) {
matcher.appendReplacement(sb, System.lineSeparator());
}
matcher.appendTail(sb);
String fixedHtmlString = sb.toString().trim().replaceAll("(?m)^[ \t]*\r?\n", "");
FileWriter fw = new FileWriter(savefile);
fw.write(fixedHtmlString);

fw.close();


} catch (Exception ex) {
System.out.println(ex.getMessage());
}
});

//Save file to RTF or HTML
save.setOnAction(ActionEvent -> {
FileChooser fc = new FileChooser();
fc.getExtensionFilters()
.addAll(
new FileChooser.ExtensionFilter(".rtf files (*.rtf)", "*.rtf"),
new FileChooser.ExtensionFilter(".html files (*.html)", "*.html"));
File savefile = fc.showSaveDialog(null);
try {
FileWriter fw = new FileWriter(savefile);
fw.write(htmlEditor.getHtmlText());

fw.close();

} catch (Exception ex) {
System.out.println(ex.getMessage());
}
});

// EXIT PROGRAM
exit.setOnAction(ActionEvent -> {
System.exit(1);
});

// Open About window
about.setOnAction(ActionEvent -> alert.showAndWait());

//OPEN FILE IN EDITOR WITH DOUBLE CLICK
list.setOnMouseClicked((EventHandler<MouseEvent>) mouseEvent -> {
if (mouseEvent.getClickCount() == 2) {
File item = (File) list.getSelectionModel().getSelectedItem();

ArrayList<String> lines = new ArrayList<String>();

try (BufferedReader reader = new BufferedReader(new FileReader(new File(String.valueOf(item))))) {

String line;
while ((line = reader.readLine()) != null)
lines.add(line);

} catch (IOException e1) {
e1.printStackTrace();
}
lines.forEach(htmlEditor::setHtmlText);
}
});

// BUTTON FOR UPDATING THE LIST
Button refresh = new Button("Refresh List");
refresh.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
files.clear();
files.setAll();
}
});


//GENERAL WINDOW SETTINGS
StackPane stackPane = new StackPane();
SplitPane split = new SplitPane();
split.setDividerPositions(0.3);
split.getItems().add(list);
split.getItems().add(htmlEditor);
HBox hb = new HBox();
hb.getChildren().add(c);
hb.getChildren().add(refresh);

BorderPane borderpane = new BorderPane();
borderpane.setTop(menuBar);
borderpane.setCenter(split);
borderpane.setLeft(list);
borderpane.setRight(htmlEditor);
borderpane.setBottom(hb);


stackPane.getChildren().add(borderpane);

Scene scene = new Scene(stackPane);

primaryStage.setTitle("J4hN0te");
primaryStage.setScene(scene);
primaryStage.setMinWidth(900);
primaryStage.setMinHeight(700);
primaryStage.show();

}
}

最佳答案

您基本上需要跟上加载到 ListView 中的当前目录。按照代码中的 currentFolderLoaded 进行操作。

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.web.HTMLEditor;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import java.io.*;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main extends Application
{

File currentFolderLoaded = null;//Use to keep track of current folder loaded in ListView

public static void main(String[] args)
{
launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception
{

//Create list with files
ObservableList files = FXCollections.observableArrayList();
ListView list = new ListView(files);
Button c = new Button("Load Folder");
c.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent e)
{
DirectoryChooser dc = new DirectoryChooser();
dc.setInitialDirectory(new File(System.getProperty("user.home")));
File choice = dc.showDialog(primaryStage);
if (choice == null || !choice.isDirectory()) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Could not open directory");
alert.setContentText("The file is invalid.");

alert.showAndWait();
}
assert choice != null;
currentFolderLoaded = new File(choice.getAbsolutePath());//Assign the currently loaded folder to this variable
File[] selectedFiles = choice.listFiles();
files.removeAll(files);
files.addAll(selectedFiles);
list.setCellFactory(lv -> new ListCell<File>()
{
@Override
protected void updateItem(File file, boolean empty)
{
super.updateItem(file, empty);
setText(file == null ? null : file.getName());
}
});
}
});

// MENUS
MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu("File");
Menu help = new Menu("help");

//Menu contents
// Menu FILE
MenuItem newfile = new MenuItem("New");
MenuItem open = new MenuItem("Open");
MenuItem save = new MenuItem("Save");
MenuItem export = new MenuItem("Export to txt");
MenuItem exit = new MenuItem("Exit");

newfile.setAccelerator(new KeyCodeCombination(KeyCode.N, KeyCombination.CONTROL_DOWN));
open.setAccelerator(new KeyCodeCombination(KeyCode.O, KeyCombination.CONTROL_DOWN));
save.setAccelerator(new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN));
export.setAccelerator(new KeyCodeCombination(KeyCode.E, KeyCombination.CONTROL_DOWN));
exit.setAccelerator(new KeyCodeCombination(KeyCode.W, KeyCombination.CONTROL_DOWN));

//Menu HELP
MenuItem about = new MenuItem("About J4hN0te");

//Adding Menus in the box
menuBar.getMenus().addAll(menuFile, help);
menuFile.getItems().addAll(newfile, open, save, export, exit);
help.getItems().addAll(about);

//CREATE TEXTEDITOR
final HTMLEditor htmlEditor = new HTMLEditor();
htmlEditor.setPrefHeight(500);
htmlEditor.setPrefWidth(600);

//SCROLLIST
ScrollPane scrollpane = new ScrollPane();
scrollpane.getStyleClass().add("noborder-scroll-pane");
scrollpane.setContent(htmlEditor);
scrollpane.setFitToHeight(true);

// ABOUT WINDOW
String programName = "J4hN0te";
String version = "1.0 alpha";
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Om programmet");
alert.setHeaderText(programName + " - Version " + version + "\nEtt program skapat i kursen \"Intro Javaprogrammering\"\nYrkesAkademin Sundsvall - HT2019");
alert.setContentText("Vi som gjort programmet är:\n André Pähn \n Fredrik Lax");

// CREATE NEW FILE
newfile.setOnAction(ActionEvent -> {
htmlEditor.setHtmlText("");
});

//OPEN FILE
open.setOnAction(ActionEvent -> {

ArrayList<String> lines = new ArrayList<String>();
FileChooser fc = new FileChooser();
fc.getExtensionFilters()
.addAll(
new FileChooser.ExtensionFilter(".rtf files (*.rtf)", "*.rtf"),
new FileChooser.ExtensionFilter(".html files (*.html)", "*.html"));
File selectedFile = fc.showOpenDialog(null);

try (BufferedReader reader = new BufferedReader(new FileReader(new File(String.valueOf(selectedFile))))) {

String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}

}
catch (IOException e1) {
e1.printStackTrace();
}
lines.forEach(htmlEditor::setHtmlText);
});

// EXPORT FILE TO TXT
export.setOnAction(ActionEvent -> {
FileChooser fc = new FileChooser();
fc.getExtensionFilters()
.addAll(
new FileChooser.ExtensionFilter(".txt files (*.txt)", "*.txt"));
File savefile = fc.showSaveDialog(null);
try {
String htmlString = htmlEditor.getHtmlText();
Pattern pattern = Pattern.compile("<[^>]*>");
Matcher matcher = pattern.matcher(htmlString);
final StringBuffer sb = new StringBuffer(htmlString.length());
while (matcher.find()) {
matcher.appendReplacement(sb, System.lineSeparator());
}
matcher.appendTail(sb);
String fixedHtmlString = sb.toString().trim().replaceAll("(?m)^[ \t]*\r?\n", "");
FileWriter fw = new FileWriter(savefile);
fw.write(fixedHtmlString);

fw.close();

}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
});

//Save file to RTF or HTML
save.setOnAction(ActionEvent -> {
FileChooser fc = new FileChooser();
fc.getExtensionFilters()
.addAll(
new FileChooser.ExtensionFilter(".rtf files (*.rtf)", "*.rtf"),
new FileChooser.ExtensionFilter(".html files (*.html)", "*.html"));
File savefile = fc.showSaveDialog(null);
try {
FileWriter fw = new FileWriter(savefile);
fw.write(htmlEditor.getHtmlText());

fw.close();

}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
});

// EXIT PROGRAM
exit.setOnAction(ActionEvent -> {
System.exit(1);
});

// Open About window
about.setOnAction(ActionEvent -> alert.showAndWait());

//OPEN FILE IN EDITOR WITH DOUBLE CLICK
list.setOnMouseClicked((EventHandler<MouseEvent>) mouseEvent -> {
if (mouseEvent.getClickCount() == 2) {
File item = (File) list.getSelectionModel().getSelectedItem();

ArrayList<String> lines = new ArrayList<String>();

try (BufferedReader reader = new BufferedReader(new FileReader(new File(String.valueOf(item))))) {

String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}

}
catch (IOException e1) {
e1.printStackTrace();
}
lines.forEach(htmlEditor::setHtmlText);
}
});

// BUTTON FOR UPDATING THE LIST
Button refresh = new Button("Refresh List");
refresh.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent e)
{
//Refresh the currently loaded folder
if(currentFolderLoaded != null)
{
File[] selectedFiles = currentFolderLoaded.listFiles();
files.setAll(selectedFiles);
}
else
{
System.out.println("NO DIRECTORY CHOSEN!");
}
}
});

//GENERAL WINDOW SETTINGS
StackPane stackPane = new StackPane();
SplitPane split = new SplitPane();
split.setDividerPositions(0.3);
split.getItems().add(list);
split.getItems().add(htmlEditor);
HBox hb = new HBox();
hb.getChildren().add(c);
hb.getChildren().add(refresh);

BorderPane borderpane = new BorderPane();
borderpane.setTop(menuBar);
borderpane.setCenter(split);
borderpane.setLeft(list);
borderpane.setRight(htmlEditor);
borderpane.setBottom(hb);

stackPane.getChildren().add(borderpane);

Scene scene = new Scene(stackPane);

primaryStage.setTitle("J4hN0te");
primaryStage.setScene(scene);
primaryStage.setMinWidth(900);
primaryStage.setMinHeight(700);
primaryStage.show();

}
}

关于java - 从目录选择器获取列表时,如何使用按钮更新 ListView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58395508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com