Вместо того, чтобы пытаться изменить Scene
, похоже, вы просто хотите обновить части экрана.
Ниже приведен простой пример использования BorderPane
для корневого макета и последующего изменения содержимого панели CENTER
при нажатии кнопки.
Пример ниже просто переключает содержимое для разных меток, но вы также можете легко использовать root.setCenter()
для передачи всего VBox
или HBox
или любого другого заполненного контейнера.
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
private BorderPane root;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setWidth(500);
// Simple interface. The buttons will be on the left and the contents of the center section will change
// when buttons are clicked.
root = new BorderPane();
root.setPadding(new Insets(10));
// Create the left pane, containing buttons to switch the CENTER content
VBox paneButtonBox = new VBox(5);
paneButtonBox.setAlignment(Pos.TOP_CENTER);
paneButtonBox.setPadding(new Insets(10));
// Create 3 buttons to change the contents of the CENTER
Button btnView1 = new Button("View 1");
btnView1.setOnAction(e -> switchContent(1));
Button btnView2 = new Button("View 2");
btnView2.setOnAction(e -> switchContent(2));
Button btnView3 = new Button("View 3");
btnView3.setOnAction(e -> switchContent(3));
// Add the Buttons to the button box
paneButtonBox.getChildren().addAll(btnView1, btnView2, btnView3);
// Add the button box to the LEFT of root pane
root.setLeft(paneButtonBox);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
/**
* @param view is the # of the content we want to display. For this sample, just to demonstrate.
*/
private void switchContent(int view) {
// Change the content of the CENTER node based on button clicked
switch (view) {
case 1:
root.setCenter(new Label("THIS IS VIEW 1"));
break;
case 2:
root.setCenter(new Label("THIS IS VIEW 2"));
break;
case 3:
root.setCenter(new Label("THIS IS VIEW 3"));
break;
}
}
}
Приведенный выше код создает следующую компоновку:
Label
справа изменяется при нажатии каждой кнопки. Надеюсь, это поможет вам в правильном направлении.
Основная концепция - создать часть макета, содержимое которой вы можете изменить. BorderPane
предоставляет эти разделы для вас, но вы также можете просто создать отдельный VBox
самостоятельно и просто позвонить VBox.getChildren().addAll()
и передать любые Node
объекты, которые вы хотите, когда вам нужно изменить содержимое.
Другой вариант
Другим способом реализации аналогичной функциональности интерфейса было бы использование TabPane
. Каждый Tab
, который вы добавляете к TabPane
, имеет свойство content
, которое вы можете использовать для установки любых узлов по вашему выбору, аналогично тому, как BorderPane
работает выше:
@Override
public void start(Stage primaryStage) {
primaryStage.setHeight(300);
primaryStage.setWidth(500);
TabPane root = new TabPane();
// Create Separate Tabs
Tab tab1 = new Tab("Section 1");
tab1.setContent(new Label("This is Section 1!"));
Tab tab2 = new Tab("Section 2");
tab2.setContent(new Label("This is Section 2!"));
Tab tab3 = new Tab("Section 3");
tab3.setContent(new Label("This is Section 3!"));
root.getTabs().addAll(tab1, tab2, tab3);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
И этот результат: