点击位于BorderPane中心区域的节点后,我正在尝试重新设计BorderPane的正确区域(使用新窗格)!
我确信这是一个很容易解决的问题,但是到目前为止,我还无法将其他资源的信息与我的具体问题放在一起。
另外,我希望答案仅涵盖javafx编码解决方案,因为到目前为止我还没有使用过fxml方法!
非常感谢您的帮助!
我的代码如下:
点击操作(在单独的课程中):
// StackPane action when clicked
dbShapeStackPane.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent event) {
//some other actions when clicked
//get logic for re-populate pane
DataRAB_SectionReportPane reportListPane = new DataRAB_SectionReportPane();
Pane reportList = reportListPane.addMainPane(false, reportDisplayName);
//activate main class
BaseGUI mainTab = new BaseGUI();
mainTab.addReportPane(reportList);
}
});
包含上述点击操作调用的单独方法的主类:
@Override
public void start (Stage primaryStage) {
//attempt SQL PROMOTEX DB connection
connection = new AddConnection();
connection.makeConnection();
innerPane = new BorderPane();
DataRAB_SectionReportPane dataRAB_reportPane = new DataRAB_SectionReportPane();
reportList = new Pane();
reportList = dataRAB_reportPane.addMainPane(true, "test Label!");
reportList.setPrefSize(350, 200);
DataRAB_SectionMenu dataRAB_Menu = new DataRAB_SectionMenu();
pageMenu = dataRAB_Menu.addHBoxMenu(15,12,15,12);
DataRAB_SectionValidateDataImportFiles validateData = new DataRAB_SectionValidateDataImportFiles();
validateDataImport = validateData.buildValidationBorderPane();
DataRAB_SectionDBsGrid dbGrid = new DataRAB_SectionDBsGrid();
mainPageGridArea = dbGrid.buildDBGraphicalGrid();
DataRAB_SectionInfoPane infoGrid = new DataRAB_SectionInfoPane();
mainPageInfoGridArea = infoGrid.buildInfoGridPane();
mainPageInfoGridArea.setPrefSize(200, 200);
innerPane.setCenter(mainPageGridArea);
innerPane.setTop(pageMenu);
innerPane.setBottom(validateDataImport);
innerPane.setRight(reportList);
innerPane.setLeft(mainPageInfoGridArea);
Region region = new Region();
region.getStyleClass().add("stage-init");
pageMenu.getChildren().add(region);
primaryStage.initStyle(StageStyle.UNDECORATED);
final BorderPane mainPane = new BorderPane();
final TabPane mainTabPane = new TabPane();
final Tab data_RABTab = new Tab();
data_RABTab.setText("Data Validation");
mainTabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
data_RABTab.setContent(innerPane);
mainTabPane.getTabs().add(data_RABTab);
final Main_ToolBar1 mainToolBar = new Main_ToolBar1();
appMainToolBar = new ToolBar();
appMainToolBar = mainToolBar.createMainToolBar(primaryStage, mainPageGridArea);
appMainToolBar.setId("mainToolBar");
mainPane.setCenter(mainTabPane);
mainPane.setTop(appMainToolBar);
scene = new Scene(mainPane, 1200, 700);
scene.getStylesheets().add(BaseGUI.class.getResource("DataRAB_Styles.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
}
//re-add modified Pane to scene
public void addReportPane(Pane pane){
pane = new Pane();
try {
// innerPane = BorderPane original parent
innerPane.getChildren().remove(innerPane.getRight());
innerPane.setRight(pane);
} catch(Exception ex) {
Logger.getLogger(BaseGUI.class.getName()).log(Level.SEVERE,null,ex);
System.out.println("Right part of Pane NOT removed!");
}
}
public static void main(String[] args) { launch(args); }
}
试图总结:
innerPane(= Parent BorderPane容器 - &gt;在main中定义 class:Base_GUI)
dbShapeGrid(= GridPane;放在innerPane的中心;包含 StackPane dbShapeStackPane作为孩子;所有定义,逻辑,儿童 dbShapeGrid存在于其自己的类中)
我的目标是:当点击dbShapeStackPane时,应该根据逻辑在场景中重新初始化innerPane的右侧 方法:addMainPane; 我尝试了一种不同的方法如下(仍然没有成功):
dbShapeStackPane.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent event) {
//some other actions when clicked
//get logic for re-populate pane ( from class: DataRAB_SectionReportPane)
//logic is tested and works well if initialised first on scene
DataRAB_SectionReportPane reportListPane = new DataRAB_SectionReportPane();
Pane reportList = reportListPane.addMainPane(false, reportDisplayName);
//activate main class
BaseGUI mainTab = new BaseGUI();
final BorderPane bp = mainTab.getInnerPane();
//try to re design the innerPane by using runnable
Platform.runLater(new Runnable() {
@Override
public void run() {
bp.setRight(reportList);
}
});
}
});
...
dbShapeStackPane.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent event) {
//some other actions when clicked
//get logic for re-populate pane ( from class: DataRAB_SectionReportPane)
//logic is tested and works well if initialised first on scene
DataRAB_SectionReportPane reportListPane = new DataRAB_SectionReportPane();
Pane reportList = reportListPane.addMainPane(false, reportDisplayName);
//activate main class
BaseGUI mainTab = new BaseGUI();
final BorderPane bp = mainTab.getInnerPane();
//try to re design the innerPane by using runnable
Platform.runLater(new Runnable() {
@Override
public void run() {
bp.setRight(reportList);
}
});
}
});
答案 0 :(得分:0)
方法addReportPane()始终将innerPane的右侧设置为空窗格,而不是尝试:
public void addReportPane(Pane pane) {
try {
innerPane.setRight(pane);
} catch(Exception ex) {
Logger.getLogger(BaseGUI.class.getName()).log(Level.SEVERE,null,ex);
System.out.println("Right part of Pane NOT removed!");
}
}
此外,DB数据检索应该在JavaFX主线程的其他线程(您提到的可运行)中完成。此外,JavaFX还为其提供了自己的功能API。在该站点搜索该主题(如“后台作业线程,数据库连接冻结”等),有很好的参考讨论和演示代码。