为什么将JavaFX TableView添加到VBox会使其他节点消失?

时间:2017-04-07 04:53:39

标签: layout javafx tableview vbox richtextfx

编辑:忘记代码......

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

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

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

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

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

TableViews似乎没有重叠......任何想法为什么AutoCompleteTextArea正在消失?另一个奇怪的事情是,如果我用常规TextField替换AutoCompleteTextArea,一切正常!

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

第132行是有问题的一行。

我希望有人能够迎接挑战!

更多背景: 我原本只想拥有一个TableView,并根据用户在视图菜单中的选择更新它的内容。但我无法找到一个很好的方法来做到这一点,现在我又来了......(见这篇文章:How do I clone a 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);
        }
    }

}

0 个答案:

没有答案