0

编辑:忘记代码...

我有一个应用程序,让用户选择 CSV 文件进行查看。我正在使用 JavaFX TableViews 来显示数据。

对于一页,用户可以在一个特殊的文本框中键入。这是我创建的一个名为 AutoCompleteTextArea 的自定义类,它扩展了 RichTextFX 的 StyleClassedTextArea。在其他页面上,此文本框应隐藏。当我只有一个 TableView 时,一切正常。

vbox.getChildren().addAll(menuBar, title, subtitle, reqBox, reqTable);

但我需要其他具有不同 TableViews 的页面。如果我向 VBox 添加另一个 TableView,我的 AutoCompleteTextArea 就会消失!

vbox.getChildren().addAll(menuBar, title, subtitle, reqBox, reqTable, tempTable);

TableViews 似乎没有重叠......知道为什么 AutoCompleteTextArea 正在消失吗?另一个奇怪的事情是,如果我用常规的 TextField 代替 AutoCompleteTextArea,一切都会正常工作!

这是我的代码。您需要在构建路径上使用RichTextFX才能运行它。使用查看菜单查看问题。第一个菜单项显示 AutoCompleteTextArea(在工作情况下)。第二个菜单项显示了一个不同的 TableView,但这是损坏的情况 - AutoCompleteTextArea 从第一页消失了。

第 132 行是有问题的行。

我希望有人能接受挑战!

更多背景:我原本只想拥有一个 TableView,并根据用户在 View Menu 中的选择来更新它的内容。但是我找不到这样做的好方法,现在我又来了……(请参阅这篇文章:如何克隆 JavaFX TableView?

package FLOOR;

// --- Imports
import java.util.LinkedList;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import org.fxmisc.richtext.StyleClassedTextArea;
import javafx.application.Application;
import javafx.beans.property.StringProperty;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;

// --- Main Class
public class Example extends Application {

    // --- All Pages
    final Page[] pages = new Page[] {
        new Page("Welcome!",
                "Welcome Page"),
        new Page("Page 1", "Shows Table_1"),
        new Page("Page 2", "Shows Table_2"), 
    };

    // --- All Tables
    TableView<ObservableList<StringProperty>> reqTable = new TableView<>();
    TableView<ObservableList<StringProperty>> tempTable = new TableView<>();
    //TextField reqBox = new TextField();
    AutoCompleteTextArea reqBox = new AutoCompleteTextArea();

    // --- Current Page
    final Label title = new Label();
    final Label subtitle = new Label();

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

    // --- Start
    @Override
    public void start(Stage stage) {

        // --- Menus
        // --- File Menu
        // --- Import Submenu
        Menu menuFile = new Menu("File");
        Menu importMenu = new Menu("Import");
        MenuItem reqOption = new MenuItem("Requirements");
        MenuItem tempOption = new MenuItem("Templates");
        importMenu.getItems().addAll(reqOption, tempOption);        
        //Import Requirements
        reqOption.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
                //TODO
            }
        });
        //Import Templates
        tempOption.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
                //TODO
            }
        });

        //Export
        MenuItem export = new MenuItem("Export");
        export.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent t) {
                //TODO
            }
        });

        //Exit
        MenuItem exit = new MenuItem("Exit");
        exit.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent t) {
                System.exit(0);
            }
        });
        menuFile.getItems().addAll(importMenu, export, new SeparatorMenuItem(), exit);

        // --- View Menu
        Menu menuView = new Menu("View");
        //Page1
        MenuItem viewRequirements = new MenuItem("Requirements");
        viewRequirements.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent t) {
                getPage1();
            }
        });
        //Page2
        MenuItem viewTemplates = new MenuItem("Templates");
        viewTemplates.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent t) {
                getPage2();
            }
        });
        menuView.getItems().addAll(viewRequirements, viewTemplates);

        // --- Menu Bar
        MenuBar menuBar = new MenuBar();
        menuBar.getMenus().addAll(menuFile, menuView);

        // --- VBox
        final VBox vbox = new VBox();
        vbox.setAlignment(Pos.TOP_CENTER);
        vbox.setSpacing(10);
        reqTable.setMinHeight(300);
        tempTable.setMinHeight(300);
        reqTable.translateYProperty().set(30);
        tempTable.translateYProperty().set(-275);
        reqTable.setVisible(false);
        tempTable.setVisible(false);
        reqBox.setVisible(false);

        // --- Welcome Page
        title.setFont(new Font("Arial", 24));
        title.translateYProperty().set(10);
        title.setText(pages[0].title);
        subtitle.setText(pages[0].subtitle);
        subtitle.setMinHeight(30);
        subtitle.setTextAlignment(TextAlignment.CENTER);

        // --- Show FLOOR
        vbox.getChildren().addAll(menuBar, title, subtitle, reqBox, reqTable);
        //vbox.getChildren().addAll(menuBar, title, subtitle, reqBox, reqTable, tempTable);
        Scene scene = new Scene(vbox, 900, 500);
        stage.setScene(scene);
        stage.setTitle("FLOOR");
        stage.show();
    }

    // --- Methods
    // Page Getters
    private void getPage1() {
        title.setFont(new Font("Arial", 24));
        title.translateYProperty().set(10);
        title.setText(pages[1].title);
        subtitle.setText(pages[1].subtitle);
        subtitle.setMinHeight(20);
        reqBox.setVisible(true);
        reqTable.setVisible(true);
        tempTable.setVisible(false);
    }
    private void getPage2() {
        title.setFont(new Font("Arial", 24));
        title.translateYProperty().set(10);
        title.setText(pages[2].title);
        subtitle.setText(pages[2].subtitle);
        subtitle.setMinHeight(20);
        reqBox.setVisible(false);
        reqTable.setVisible(false);
        tempTable.setVisible(true);
    }

    // --- Classes
    // Page
    private class Page {
        public String title;
        public String subtitle;
        public Page(String title, String subtitle) {
            this.title = title;
            this.subtitle = subtitle;
        }
    }

    // AutoCompleteTextArea
    public class AutoCompleteTextArea extends StyleClassedTextArea {
        public final SortedSet<String> entries;
        public ContextMenu entriesPopup;

        public AutoCompleteTextArea() {
            super();
            entries = new TreeSet<>();
            entriesPopup = new ContextMenu();
        }

        public SortedSet<String> getEntries() { return entries; }

        public void populatePopup(List<String> searchResult) {
            List<CustomMenuItem> menuItems = new LinkedList<>();
            int maxEntries = 20;
            int count = Math.min(searchResult.size(), maxEntries);
            for (int i = 0; i < count; i++) {
                final String result = searchResult.get(i);
                Label entryLabel = new Label(result);
                CustomMenuItem item = new CustomMenuItem(entryLabel, true);
                menuItems.add(item);
            }
            entriesPopup.getItems().clear();
            entriesPopup.getItems().addAll(menuItems);
        }
    }

}
4

0 回答 0