首页 > 解决方案 > TabPane 不会出现在边框的中心窗格中

问题描述

我正在开发这个 GUI(编程新手),基本上当我右键单击“新组件”并添加“添加参数”并单击“高”或“低”时,应该会出现一个带有 2 个选项卡的 tabPane。我在 Scene builder 中为 Borderpane 指定了一个 fx:id,但我认为问题是 Scene builder 中的第一个 Borderpane 与所有内容重叠,我试图在 ContextMenuTreeCell.java 中创建一个新的borderpane(如下所示)。但我不确定如何解决这个问题,我想在 Controller.java 中调用它

任何帮助将不胜感激,谢谢。

主.java

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;

import javafx.scene.control.Button;
import javafx.stage.Stage;

public class Main extends Application {

    Stage window;
    Button button;

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        window = primaryStage;
        window.setTitle("LOPA Software");

        window.setScene(new Scene(root, 800, 500));
        window.show();
    }
}

控制器.java

package sample;

import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.util.Callback;

import java.awt.event.MouseEvent;
import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable {

    @FXML
    TreeView<String> treeView;

    @FXML
    TableView tableView1;

    @FXML
    TableView tableView2;

    @FXML
    BorderPane borderPane;

    @FXML
    Button button1;

    @FXML
    Button button2;

    Image icon = new Image(
            getClass().getResourceAsStream("/img/icon.png"));
    private MouseEvent mouseEvent;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        TreeItem<String> root = new TreeItem<>("Project", new ImageView(icon));
        root.setExpanded(true);

        TreeItem<String> compA = new TreeItem<>("New Component", new ImageView(icon));
        root.getChildren().addAll(compA);
        compA.setExpanded(true);

        treeView.setRoot(root);
        treeView.setEditable(true);
        treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
            @Override
            public TreeCell<String> call(TreeView<String> p) {
                return new ContextMenuTreeCell();
            }
        });
}

ContextMenuTreeCell.java

package sample;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.control.cell.TextFieldTreeCell;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.util.converter.DefaultStringConverter;
import sun.reflect.generics.tree.Tree;

import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.Map;

public class ContextMenuTreeCell extends TextFieldTreeCell<String> {
    Image icon = new Image(
            getClass().getResourceAsStream("/img/icon.png"));

    private ContextMenu menu = new ContextMenu();

    @FXML
    BorderPane borderPane;
    static final Map<TreeItem<String>, BorderPane> map = new HashMap<>();



    public ContextMenuTreeCell() {
        super(new DefaultStringConverter());

        MenuItem addItem = new MenuItem("Add Component");
        menu.getItems().add(addItem);
        addItem.setOnAction(arg0 -> {
            TreeItem<String> additem = new TreeItem<>("New Component", new ImageView(icon));
            getTreeItem().getChildren().add(additem);
        });
        MenuItem addItem2 = new MenuItem("Add Parameter");
        menu.getItems().add(addItem2);
        addItem2.setOnAction(arg0 -> {
            TreeItem<String> newLeaf = new TreeItem<>("Parameter", new ImageView(icon));
            TreeItem<String> uxItem1 = new TreeItem<>("High", new ImageView(icon));
            map.put(uxItem1, getcenterPane());
            TreeItem<String> uyItem1 = new TreeItem<>("Low", new ImageView(icon));
            map.put(uyItem1, getcenterPane2());
            newLeaf.getChildren().add(uxItem1);
            newLeaf.getChildren().add(uyItem1);
            getTreeItem().getChildren().add(newLeaf);
        });

        MenuItem renameItem = new MenuItem("Rename");
        menu.getItems().add(renameItem);
        renameItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent arg0) {
                startEdit();
            }
        });
        MenuItem deleteitem = new MenuItem("Delete");
        menu.getItems().add(deleteitem);
        deleteitem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                TreeItem c = (TreeItem)getTreeView().getSelectionModel().getSelectedItem();
                boolean remove = c.getParent().getChildren().remove(c);
            }
        });

    }
    public BorderPane getcenterPane() {
        BorderPane borderPane = new BorderPane();
        Tab tab = new Tab("Test tab");
        Tab tab2 = new Tab("Tab 2");
        TabPane tabPane = new TabPane(tab, tab2);
        borderPane.setCenter(tabPane);
        return borderPane;
    }
    public BorderPane getcenterPane2() {
        BorderPane borderPane = new BorderPane();
        Tab tab = new Tab("PHA Low");
        Tab tab2 = new Tab("LOPA Low ");
        TabPane tabPane = new TabPane(tab, tab2);
        borderPane.setCenter(tabPane);
        return borderPane;
    }
    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if (!isEditing()) {
            setContextMenu(menu);
        }
    }

}

示例.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>

<BorderPane fx:id="borderPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
    <top>
        <VBox BorderPane.alignment="CENTER">
            <children>
                <MenuBar>
                    <menus>
                        <Menu mnemonicParsing="false" text="File">
                            <items>
                                <MenuItem mnemonicParsing="false" text="Open" />
                                <MenuItem mnemonicParsing="false" text="Save" />
                                <MenuItem mnemonicParsing="false" text="Close" />
                            </items>
                        </Menu>
                        <Menu mnemonicParsing="false" text="Edit">
                            <items>
                                <MenuItem mnemonicParsing="false" text="Copy" />
                                <MenuItem mnemonicParsing="false" text="Cut" />
                                <MenuItem mnemonicParsing="false" text="Paste" />
                            </items>
                        </Menu>
                        <Menu mnemonicParsing="false" text="Help">
                            <items>
                                <MenuItem mnemonicParsing="false" text="About" />
                            </items>
                        </Menu>
                    </menus>
                </MenuBar>
                <ToolBar>
                    <items>
                        <Button mnemonicParsing="false" text="Toolbar" />
                  <Button fx:id="button1" mnemonicParsing="false" text="Add New Row" />
                  <Button fx:id="button2" mnemonicParsing="false" text="Delete Row" />
                    </items>
                </ToolBar>
            </children>
        </VBox>
    </top>
    <left>
        <TreeView fx:id="treeView" editable="true" onMouseClicked="#mouseClick" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
    </left>
    <bottom>
        <HBox BorderPane.alignment="CENTER">
            <children>
                <Label text="Label" />
            </children>
        </HBox>
    </bottom>
</BorderPane>

标签: javajavafx

解决方案


推荐阅读