Как изменить центральную панель с левой панели в JavaFX BorderPane?

#java #javafx #borderpane

#java #javafx #borderpane

Вопрос:

Я пытаюсь создать панель в javafx, и я использовал пограничную панель в качестве основной сцены. Для центральной панели есть 4 окна (main1, main2, main3, main4), а на левой панели есть меню навигации.

 borderPane.setCenter(mainMenu1.getCenterMain1UI());
//borderPane.setCenter(mainMenu2.getCenterMain2UI());
//borderPane.setCenter(mainMenu3.getCenterMain3UI());
//borderPane.setCenter(mainMenu4.getCenterMain4UI());


public BorderPane getAppWindow(){

    if (borderPane == null){

        borderPane = new BorderPane();
        borderPane.setTop(topPanel.getTopPanelUI());
        borderPane.setBottom(bottomPanel.getBottomPanelUI());
        borderPane.setLeft(leftPanel.getLeftPanelUI());

        borderPane.setCenter(mainMenu.getCenterMainUI());
        borderPane.setAlignment(borderPane.getCenter(), Pos.TOP_LEFT);

    }

    return borderPane;
}
  

в контроллере левой панели

  public class LeftPanelController {

        public VBox leftPanelPane;

        public Button btnLeftPanelMainmenu;
        public Button btnLeftPanelDb;
        public Button btnLeftPanelOfficeInfo;
        public Button btnLeftPanelConfiguration;



        public void btnLeftPanelMainmenuOnClickAction(ActionEvent e){
            change border pane center to main
        }

        public void btnLeftPanelDbOnClickAction(ActionEvent e){
            change border pane center to DB
        }

        public void btnLeftPanelOfficeInfoOnClickAction(ActionEvent e){
            change border pane center to DB
        }

        public void btnLeftPanelConfigurationOnClickAction(ActionEvent e){
            change border pane center to configuration
        }

    }
  

Комментарии:

1. Вы заменяете center 3 раза в этом коде (или 4 раза, если center не null было до вызова кода). Попробуйте заменить center once on взаимодействия с левой панелью.

2. Мне действительно неясно, в чем собственно заключается вопрос. Вызовите одну из строк кода, которые вы разместили в обработчике щелчков Button левой панели?

Ответ №1:

Вам нужно будет установить событие on action для каждой из ваших кнопок меню, чтобы оно изменяло то, что отображается в центре BorderPane .

Вот пример:

 import java.util.LinkedHashMap;
import java.util.Map;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class BorderPaneExample extends Application {

    private Map<String, Node> menuOptions;
    private Node defaultCenterNode = new Label("Example node 1");

    @Override
    public void start(Stage primaryStage) throws Exception {

        menuOptions = new LinkedHashMap<>();  
        menuOptions.put("Main Menu", defaultCenterNode);
        menuOptions.put("History", new Label("Example node 2"));
        menuOptions.put("Office Info", new Label("Example node 3"));
        menuOptions.put("Configuration", new Label("Example node 4"));
        BorderPane root = new BorderPane();
        root.setCenter(defaultCenterNode);
        VBox menuLayout = new VBox();

        for (String key : menuOptions.keySet()) {
            Button button = new Button(key);
            button.setMaxWidth(Double.MAX_VALUE);
            button.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    root.setCenter(menuOptions.get(key));
                }
            });
            menuLayout.getChildren().add(button);
        }

        root.setLeft(menuLayout);

        Scene scene = new Scene(root, 800, 600);

        primaryStage.setScene(scene);
        primaryStage.setTitle("BorderPane Example");
        primaryStage.setResizable(false);
        primaryStage.sizeToScene();
        primaryStage.show();

    }

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

Комментарии:

1. вы правы, но мои mainStage, LeftPanel и centerPanel находятся в разных каталогах. Я опубликовал скриншот об иерархии.

2. @enes, Не зная много о классах, это трудно комментировать. Однако, предполагая, что они расширяются Node , вы можете просто создавать новые экземпляры этих классов в соответствии с Label ‘s в приведенном мной примере.

3. большое спасибо, все компоненты — это панель привязки в центре. слева есть vbox. я обновил новое изображение appWindow, которое вызывает все панели.

4. я изменил свой компонент borderpane с частного на общедоступный статический. Итак, я решил эту причину. Но я надеюсь, что не получу ошибку..

5. Лично я думаю, что структура вашей программы нуждается в переосмыслении. Добавьте метод, который позволяет обновлять центр без необходимости делать BorderPane общедоступным и, конечно, не статичным, например public void updateCenter(Node node)

Ответ №2:

Я изменил свои методы нажатия кнопок на левой панели следующим образом;

     public void btnLeftPanelMainmenuOnClickAction(ActionEvent e) {
        AppWindow.borderPane.setCenter(AppWindow.mainMenu.getCenterMainUI());
    }

    public void btnLeftPanelDbOnClickAction(ActionEvent e) {
        AppWindow.borderPane.setCenter(AppWindow.dbMenu.getCenterDbUI());
    }

    public void btnLeftPanelConfigurationOnClickAction(ActionEvent e) {
        AppWindow.borderPane.setCenter(AppWindow.configMenu.getCenterConfigurationUI());
    }