загрузка этапа на вкладке нажатием кнопки без fxml

#javafx #tabs #fxml #main #stage

#javafx #вкладки #fxml #программа-точка входа #этап

Вопрос:

у меня есть графический интерфейс, в котором у меня есть две вкладки. на одной вкладке я хочу отобразить другой этап нажатием кнопки. я не смог найти способ решить эту проблему. я надеюсь, вы сможете мне помочь.

Я программирую все без fxml.

Вы можете увидеть графический интерфейс ниже. Вы также можете найти пометки. Мое главное окно — это то, в котором есть пометки. Другой этап должен отображаться в главном окне при нажатии кнопки.

введите описание изображения здесь

введите описание изображения здесь

 public class Controller implements Observer {
public static final int WIN_WIDTH = 1064;
public static final int WIN_HEIGHT = 600;

CreateScheme cs = new CreateScheme();


private Pane pane;

VBox vbox = new VBox();
VBox vbox2 = new VBox();
HBox hbox = new HBox();
HBox hbox2 = new HBox();
Pane pane2 = new Pane();

TreeView<File> treeview = new TreeView<File>(new SimpleFileTreeItem(new File("C:\")));

private TabPane tabPane1 = new TabPane();
private Tab tab3 = new Tab("Bewertungsschema");
private Tab tab4 = new Tab("Ordner");

TabPane tabPane = new TabPane();
Tab tab2 = new Tab("Code");
Tab tab1 = new Tab("Bewertung");


private Button createScheme = new Button("Bewertungsscheme erstellen");
private Button editScheme = new Button("Bewertungsscheme bearbeiten");
private Button exportScheme = new Button("Bewertungsscheme exportieren");
private Button startScheme = new Button("Bewertung starten");

TextArea textarea = new TextArea();
File file;



public void init() {


    vbox.setLayoutX(10.0);
    vbox.setLayoutY(35.0);
    vbox.setSpacing(10.0);
    vbox.setMaxHeight(500.0);
    vbox.getChildren().add(treeview);
    vbox.getChildren().add(tabPane1);

    vbox2.setLayoutX(10.0);
    vbox2.setLayoutY(50.0);
    vbox2.setSpacing(30.0);
    vbox2.setPadding(new Insets(80.0, 30.0, 30.0, 30.0));
    vbox2.getChildren().addAll(createScheme, editScheme, exportScheme, startScheme);

    treeview.setMaxWidth(220.0);
    treeview.setMaxHeight(550.0);
    treeview.setLayoutY(35.0);

    tab2.setContent(textarea);
    tab3.setContent(vbox2);
    tab4.setContent(treeview);
    //tab1.setContent(cs);

    textarea.getMaxHeight();
    textarea.getMinHeight();

    tabPane.getTabs().addAll(tab1, tab2);
    tabPane.setLayoutX(250.0);
    tabPane.setLayoutY(30.0);
    tabPane.setMinWidth(780.0);


    tabPane1.getTabs().addAll(tab3, tab4);
    tabPane1.setLayoutX(10);
    tabPane1.setLayoutY(30);

    pane = new Pane();
    pane.getChildren().addAll(vbox, tabPane, tabPane1);

    createScheme.setOnAction(new EventHandler<ActionEvent>() {

        public void handle(ActionEvent e) {
            changeStage();
    }

});
}

public void changeStage() {

    Stage secondStage = new Stage();

    CreateScheme cs = new CreateScheme();
    try {

        cs.start(secondStage);

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    secondStage.show();
}


public Pane getPane() {
    return this.pane;
}





public class CreateScheme extends Application {

// Variablen

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

    // Scene / root
    Pane pane = new Pane(); // Layout -> alle Elmente haben die Position 0/0
    Scene scene = new Scene(pane, 800, 600);

    // Variablen erstellen
    VBox vbox = new VBox();
    VBox vbox2 = new VBox();
    HBox hbox = new HBox();
    HBox hbox2 = new HBox();
    HBox hbox3 = new HBox();
    Label label = new Label("Bewertungsschema erstellen: ");
    Button button = new Button("New");
    TextField textField1 = new TextField();
    CheckBox checkbox = new CheckBox();
    Button addButton = new Button("Erstellen");
    Button cancelButton = new Button("Abbrechen");
    Button saveButton = new Button("Speichern");
    Button addTextFieldButton = new Button(" ");
    TableView<Model> tableview = new TableView<Model>();
    TableColumn<Model, String> table1 = new TableColumn<Model, String>("Table1");
    TableColumn<Model, String> table2 = new TableColumn<Model, String>("Table2");
    TableColumn<Model, String> table3 = new TableColumn<Model, String>("Table3");
    TableColumn<Model, String> table4 = new TableColumn<Model, String>("Table4");
    TableColumn<Model, String> table5 = new TableColumn<Model, String>("Table5");


    ObservableList<Model> list = Listen.getUserList();
    tableview.setItems(list);
    tableview.setEditable(true);
    tableview.getColumns().addAll(table1, table2, table4, table5, table3);
    table1.setCellFactory(TextFieldTableCell.<Model>forTableColumn());
    table2.setCellFactory(TextFieldTableCell.<Model>forTableColumn());
    table3.setCellFactory(TextFieldTableCell.<Model>forTableColumn());
    table4.setCellFactory(TextFieldTableCell.<Model>forTableColumn());
    table5.setCellFactory(TextFieldTableCell.<Model>forTableColumn());

    textField1.setVisible(false);
    checkbox.setVisible(false);
    vbox2.setVisible(false);

    hbox.setSpacing(10.0);
    hbox.getChildren().addAll(button, textField1, checkbox);

    vbox.setLayoutX(10.0);
    vbox.setLayoutY(30.0);
    vbox.setSpacing(30.0);
    vbox.setPadding(new Insets(10.0, 20.0, 30.0, 10.0));
    vbox.getChildren().addAll(label, hbox);

    vbox2.setLayoutX(300.0);
    vbox2.setLayoutY(30.0);
    vbox2.setSpacing(30.0);
    vbox2.setMaxHeight(200.0);
    vbox2.setPadding(new Insets(50.0, 30.0, 30.0, 30.0));
    vbox2.getChildren().add(tableview);

    hbox2.setLayoutX(10.0);
    hbox2.setLayoutY(500.0);
    hbox2.setSpacing(20.0);

    hbox3.setLayoutX(10.0);
    hbox3.setLayoutY(550.0);
    hbox3.setSpacing(20.0);
    hbox3.getChildren().addAll(addButton, cancelButton, saveButton, addTextFieldButton);

    button.setOnAction(new EventHandler<ActionEvent>() {

        public void handle(ActionEvent e) {
            textField1.setVisible(true);
            checkbox.setVisible(true);
        }
    });

    checkbox.setOnAction(new EventHandler<ActionEvent>() {

        public void handle(ActionEvent e) {
            vbox2.setVisible(true);
            textField1.setEditable(false);
        }
    });

    addTextFieldButton.setOnAction(e -> hbox2.getChildren().add(new TextField()));


    addButton.setOnAction(new EventHandler<ActionEvent>() {

        public void handle(ActionEvent e) {

                //list.add(new Model();
                tableview.refresh();
            }
    });


    pane.getChildren().addAll(vbox, vbox2, hbox2, hbox3);

    scene.getStylesheets().add("style.css");
    secondStage.setTitle("Bewertungsschema erstellen");
    secondStage.setScene(scene);
    secondStage.show();
}

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

}

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

1. кто-нибудь может мне помочь??

2. Stage По сути, это новое окно, поэтому вы не стали бы отображать его в другом Stage . Вместо этого ознакомьтесь с ответом Седрика; вы просто хотите установить содержимое вашего Tab другого корневого макета.

Ответ №1:

Я думаю, вам следует загрузить Parent узел вместо Stage . В примере BorderPane используется как root/Parent . BoderPane должен быть корневым каталогом Tab , который вы хотите использовать для этой функциональности.

 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.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication353 extends Application
{
    @Override
    public void start(Stage primaryStage)
    {
        BorderPane root = new BorderPane();

        Button btnDisplay1 = new Button("Display 1");
        VBox.setMargin(btnDisplay1, new Insets(0, 0, 0, 5));
        btnDisplay1.setOnAction((event) -> {
            loadDisplay1(root);
        });

        Button btnDisplay2 = new Button("Display 2");
        VBox.setMargin(btnDisplay2, new Insets(0, 0, 0, 5));
        btnDisplay2.setOnAction((event) -> {
            loadDisplay2(root);
        });

        VBox vbNav = new VBox(btnDisplay1, btnDisplay2);
        vbNav.setAlignment(Pos.CENTER);
        vbNav.setSpacing(5);
        root.setLeft(vbNav);

        loadDisplay1(root);//initial load of scene 1.

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

    public void loadDisplay1(BorderPane root)
    {
        Label label = new Label("Scene 1");
        StackPane displayRoot = new StackPane(label);
        root.setCenter(displayRoot);
    }

    public void loadDisplay2(BorderPane root)
    {
        Label label = new Label("Scene 2");
        StackPane displayRoot = new StackPane(label);
        root.setCenter(displayRoot);
    }

}
  

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

1. хм, я не знаю точно, как я могу это реализовать. я должен работать над этим. Но спасибо за вашу помощь @Sedrick 🙂