【问题标题】:Button isn't working after putting a VBox and a StackPane into another StackPane将 VBox 和 StackPane 放入另一个 StackPane 后,按钮不起作用
【发布时间】:2021-02-27 05:55:39
【问题描述】:

我试图在屏幕中间放置一个TextField,同时在其周围放置一个Circle,并在圆圈下方放置一个按钮。所以我用圆圈和按钮制作了一个VBox,以及一个只有TextFieldStackPane。我制作了另一个StackPaneVBoxStackPane 放在同一个场景中,但现在按钮不起作用。我真的不知道是什么原因造成的。

以下是我目前的代码。

 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package circleandtextbox;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

/**
 *
 * @author diego
 */
public class CircleAndTextBox extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        int programX = 400;
        int programY = 400;
        int circleRadius = 100;
        Circle circle = new Circle(programX / 2,programY / 2,circleRadius);
        circle.setStroke(Color.RED);
        circle.setStrokeWidth(3);
        circle.setFill(Color.TRANSPARENT);
        
        TextField input = new TextField();
        input.setMaxWidth(100);
        
        Button btn = new Button();
        btn.setText("Change the size of the circle");
        btn.setOnAction((ActionEvent event) -> {
            System.out.println("It worked!");
        });
        
        VBox root = new VBox();
        root.setAlignment(Pos.CENTER);
        root.setSpacing(10);
        root.getChildren().addAll(circle,btn);
        

        StackPane textBox = new StackPane();
        textBox.setAlignment(Pos.CENTER);
        textBox.getChildren().add(input);
        
        StackPane together = new StackPane();
        together.getChildren().addAll(root,textBox);
        
        Scene scene = new Scene(together, programX, programY);
        
        primaryStage.setTitle("Circle code");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

【问题讨论】:

    标签: java javafx layout


    【解决方案1】:

    您的第二个StackPane 覆盖了您的VBox,隐藏了它的Button。要查看效果,请更改

    together.getChildren().addAll(root, textBox);
    

    together.getChildren().addAll(textBox , root);
    

    当然,现在TextField 已覆盖。相反,对圆圈和字段使用单个 StackPane

    StackPane textBox = new StackPane();
    textBox.setAlignment(Pos.CENTER);
    textBox.getChildren().addAll(circle, input);
    

    然后使用按钮将结果添加到VBox

    VBox root = new VBox();
    root.setAlignment(Pos.CENTER);
    root.setSpacing(10);
    root.setPadding(new Insets(16));
    root.getChildren().addAll(textBox, btn);
    

    还可以考虑使用Spinner 和/或Slider(见here)来控制大小。测试代码:

    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.geometry.Insets;
    import javafx.geometry.Pos;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.Pane;
    import javafx.scene.layout.StackPane;
    import javafx.scene.layout.VBox;
    import javafx.scene.paint.Color;
    import javafx.scene.shape.Circle;
    import javafx.stage.Stage;
    
    /**
     * @author diego
     * @see https://stackoverflow.com/a/64852023/230513
     * @see https://stackoverflow.com/a/37935114/230513
     */
    public class CircleAndTextBox extends Application {
        
        @Override
        public void start(Stage primaryStage) {
            int programX = 400;
            int programY = 400;
            int circleRadius = 100;
            Circle circle = new Circle(programX / 2,programY / 2,circleRadius);
            circle.setStroke(Color.RED);
            circle.setStrokeWidth(3);
            circle.setFill(Color.TRANSPARENT);
            
            TextField input = new TextField();
            input.setMaxWidth(100);
            
            Button btn = new Button();
            btn.setText("Change the size of the circle");
            btn.setOnAction((ActionEvent event) -> {
                System.out.println("It worked!");
            });
            
            StackPane textBox = new StackPane();
            textBox.setAlignment(Pos.CENTER);
            textBox.getChildren().addAll(circle, input);
            VBox root = new VBox();
            root.setAlignment(Pos.CENTER);
            root.setSpacing(10);
            root.setPadding(new Insets(16));
            root.getChildren().addAll(textBox, btn);
            
            Scene scene = new Scene(root);
            
            primaryStage.setTitle("Circle code");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多