首页 > 解决方案 > 从目录选择器获取列表时,如何使用按钮更新列表视图?

问题描述

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

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

我制作了一个用于更新列表的按钮,但我无法让它工作。我尝试使用.clear.setAll再次删除并添加列表,但它只是删除了列表。 如何编程的示例看起来像

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

这是我的代码:

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();

  }
}

标签: javajavafx

解决方案


您基本上需要跟上加载到列表视图中的当前目录。按照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();

    }
}

推荐阅读