java - 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>
解决方案
推荐阅读
- xcode - 如何从 Xcode 将 Expo/React Native 应用程序部署到 iOS 设备
- javascript - Javascript以模数将foreach转换为for循环
- asp.net-mvc - 启动 addIceCandidate 时出现 Webrtc 错误
- pixi.js - 手动从 TexturePacker 加载 Pixi spritesheets,而不是通过 Pixi.Loader?
- java - ClassNotFoundException:WildFly 19.1 上的 java.security.acl.Group 使用 Java 14
- flutter - IconData 没有作为参数传递到类实例中
- c++ - 并行快速排序分区中的段错误
- xpath - Xpath 在浏览器和 scrapy 中给出不同的结果
- python - 在 Python 中从用户产品数据中聚合和构建矩阵的有效方法
- c++ - getch 不读取键盘输入