#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());
}