如何:使用JavaFX组织按钮和内容

时间:2016-10-02 00:08:43

标签: java css user-interface button javafx

我认为可以将我的JavaFX代码导入到SceneBuilder中,我不知道它是否可能或者是什么。 我想要的是将我的GUI模块(按钮,文本字段等)放在正确的位置。我真的很难过,因为这是我第一次使用javafx,我看到的教程是使用网格窗格。 我将非常感谢有关如何使事情变得正确和正确的位置的一些帮助或建议。如果需要,这是我的代码:

            package application;

            import javafx.scene.control.Button;
            import javafx.scene.control.ChoiceBox;
            import javafx.scene.control.Label;
            import javafx.scene.control.TextField;
            import javafx.scene.image.Image;
            import javafx.scene.image.ImageView;
            import javafx.application.Application;
            import javafx.event.ActionEvent;
            import javafx.event.EventHandler;
            import javafx.geometry.Insets;
            import javafx.stage.Stage;
            import javafx.scene.Scene;
            import javafx.scene.layout.BorderPane;
            import javafx.scene.layout.GridPane;
            import javafx.scene.layout.StackPane;
            import javafx.scene.text.Font;
            import javafx.scene.text.FontWeight;


            public class Main extends Application implementsEventHandler<ActionEvent>{

                // crea los botones 
                Button historial;   
                Button jugar;
                String jugadaComp="El jugador numero once es feo";
                int posBal=0;
                int contGA=0;
                int contGR=0;

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

                @Override
                //nombre de la ventana principal
                public void start(Stage primaryStage) throws Exception {
                    primaryStage.setTitle("Football Simulator 2016");

                    //crea los drop list
                    ChoiceBox<String> jugadasArbitro = new ChoiceBox<>();
                    jugadasArbitro.getItems().addAll("Saque de banda","Tiro de esquina","Falta","Falta(Tarjeta amarilla)", "Falta (Tarjeta roja)", "Mano","Posicion adelantada","Penal","Fuera de juego", "Gol");
                    ChoiceBox<String> jugadasOfensivas = new ChoiceBox<>();
                    jugadasOfensivas.getItems().addAll("Pase","Pase largo","Tiro a puerta");
                    ChoiceBox<String> jugadasDefensivas = new ChoiceBox<>();
                    jugadasDefensivas.getItems().addAll("Intercepcion");


                    //inicializa botones
                    Label CGA = new Label("Goles Equipo Azul");
                    Label CGR = new Label("Goles Equipo Rojo");
                    TextField golA= new TextField(String.valueOf(contGA));
                    golA.setEditable(false);
                    golA.setPrefWidth(75);
                    golA.setPrefHeight(75);
                    golA.setFont(Font.font("Verdana",FontWeight.BOLD, 40));
                    TextField golR= new TextField(String.valueOf(contGR));
                    golR.setEditable(false);
                    golR.setPrefWidth(75);
                    golR.setPrefHeight(75);
                    golR.setFont(Font.font("Verdana",FontWeight.BOLD, 40));
                    TextField tiempo = new TextField();
                    //tiempo.setPrefWidth(5);
                    TextField jugada = new TextField(jugadaComp);
                    jugada.setPrefWidth(300);
                    jugada.setEditable(false);
                    historial = new Button("Historial");
                    historial.setOnAction(e ->historialBox.display("Historial", "de lo mio mete tu historial aqui \n no bulto manito hasta salto de linea"));
                    jugar= new Button("Jugar");
                    jugar.setOnAction(e ->{ isInt(tiempo,tiempo.getText());
                    getArbitro(jugadasArbitro);
                    getOfensiva(jugadasOfensivas);
                    getDefensa(jugadasDefensivas);
                    });

                    //agrega imagenes segun posesion del balon
                    ImageView pelotaA = new ImageView(new Image(getClass().getResourceAsStream("/res/PelotaA.png"), 100, 100, true, true));
                    ImageView pelotaR = new ImageView(new Image(getClass().getResourceAsStream("/res/PelotaR.png"), 100, 100, true, true));

                    //forma del Gui y posiciona los botones
                    GridPane grid = new GridPane();
                    grid.setPadding(new Insets(10,10,10,10));
                    grid.setVgap(8);
                    grid.setHgap(10);
                    GridPane.setConstraints(CGA, 0, 0);
                    GridPane.setConstraints(golA, 0, 2);
                    GridPane.setConstraints(CGR, 37, 0);
                    GridPane.setConstraints(golR, 37, 2);       
                    GridPane.setConstraints(pelotaA, 18, 2);
                    GridPane.setConstraints(pelotaR, 18, 2);
                    GridPane.setConstraints(historial, 0, 4);
                    GridPane.setConstraints(jugar, 37, 10);
                    //GridPane.setConstraints(jugadasArbitro, 7, 4);
                    //GridPane.setConstraints(jugadasOfensivas, 3, 4);
                    //GridPane.setConstraints(jugadasDefensivas, 3, 5);
                    //GridPane.setConstraints(jugada, 3, 6);

                    grid.getChildren().addAll(golA,golR,CGA,CGR,pelotaA,pelotaR,historial,jugar);

                    //tamanio de la ventana
                    Scene scene = new Scene(grid, 700,300);
                    primaryStage.setScene(scene);
                    primaryStage.show();

                }

                //leen el valor de los drop box
                private void getDefensa(ChoiceBox<String> jugadasDefensivas) {
                    // TODO Auto-generated method stub
                    String opcionDefensa = jugadasDefensivas.getValue();
                    System.out.println(opcionDefensa);
                }

                private void getOfensiva(ChoiceBox<String> jugadasOfensivas) {
                    // TODO Auto-generated method stub
                    String opcionOfensiva = jugadasOfensivas.getValue();
                    System.out.println(opcionOfensiva);
                }

                private void getArbitro(ChoiceBox<String> jugadasArbitro) {
                    // TODO Auto-generated method stub
                    String opcionArbitro = jugadasArbitro.getValue();
                    System.out.println(opcionArbitro);
                }

                //valida que el tiempo solo sea INT
                private boolean isInt(TextField tiempo, String message) {
                    // TODO Auto-generated method stub
                    try{
                        int minutos = Integer.parseInt(tiempo.getText());
                        return true;
                    }catch (NumberFormatException e){}
                    System.out.println("Error: introduzca numeros solamente");
                    return false;

                }

                @Override
                public void handle(ActionEvent event) {


                }

            }

2 个答案:

答案 0 :(得分:0)

你的新手javafx存在的一个问题是你不知道如何正确格式化网格窗格。如果您想自由移动节点,只需使用AnchorPane即可。关于GUI的设计在场景构建器中,您可以右键单击XML文件并单击“在场景构建器中打开”,具体取决于您的IDE。如果此选项不可用,请在场景构建器中手动打开文件,并记住在运行应用程序之前保存它,否则您所做的更改将不存在。 希望这有帮助

答案 1 :(得分:0)

组织界面的方法有很多种。如果您要将事物组织到mask="H",那么您基本上将UI元素放入电子表格中。否则,您可以将按钮放入GridPane(组件的垂直对齐)或VBox(组件的水平对齐)。您可以使用HBox向边缘移动内容,或使用AnchorPane将内容放置在相对区域(左侧,右侧,中间,顶部或底部)。它们也BorderPaneFlowLayouts类似,但具有自己独特的特征。 GridPane用于将元素堆叠在彼此之上。如果您需要具体的建议,请查看文档或在网站上询问,每个都有其优点和缺点。根据您的具体情况,我建议您亲自StackPane,但这都是您的选择。