Как мне отображать кнопки и текст друг под другом с помощью JavaFX

#java #javafx

#java #javafx

Вопрос:

Я пытался отобразить кнопки и некоторый текст с помощью javafx, но он не работает, он просто отображается друг над другом в середине экрана:

окно

Я пытался использовать vbox, и я также пытался использовать hbox, но оба не меняют внешний вид при запуске

(когда я запускаю его, я не получаю ошибок) (также я использую vs code, если это может что-то сказать)

Вот мой код на данный момент:

 import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class App extends Application {

    @Override
    public void start(Stage primaryStage) {

        // buttons

        VBox vboxBtn = new VBox();
        vboxBtn.setPadding(new Insets(10, 10, 10, 10));
        vboxBtn.setSpacing(10);

        Button btnRoom = new Button("changeRoom");
        Button btnMap = new Button("changeMap");

        vboxBtn.getChildren().addAll(btnRoom, btnMap);


        // text
        
        VBox vboxTxt = new VBox();
        vboxTxt.setPadding(new Insets(10, 10, 10, 10));
        vboxTxt.setSpacing(10);

        Text txtRoom = new Text("Room");
        Text txtMap = new Text("Map");
        
        vboxTxt.getChildren().addAll(btnRoom, btnMap);

        String currentRoom = "None";
        String currentMap = "None";

        // button for switching maps
        btnMap.setText("Change the map");
        // button click
        btnMap.setOnAction(new EventHandler<ActionEvent>(){
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello world");
            }
        });

        // text for maps
        txtMap.setText("Map: "   currentMap);


        // button for switching rooms
        btnRoom.setText("Hello world");
        // button click
        btnRoom.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello world");
            }
        });

        // text
        txtRoom.setText("Room: "   currentRoom);

        StackPane root = new StackPane();
        root.getChildren().add(btnRoom);
        root.getChildren().add(btnMap);
        root.getChildren().add(txtRoom);
        root.getChildren().add(txtMap);
    
    Scene scene = new Scene(root, 300, 250);
    
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}
  

Ответ №1:

Я думаю, проблема в том, что вы добавляете butons и txts на панель вместо Vboxes и Hboxes.

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

Или вы можете установить их местоположение, я не знаю, возможно ли это с помощью кода, но вы можете сделать это в screenbuilder.

PS: проверьте screenbuilder для javafx.

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

1. Спасибо. я протестировал первое, что вы сказали, и это сработало. теперь я попробую scenebuilder (igoogled screenbuilder qnd scene builder запускается первым, поэтому я попробую)