java - 将 VBox 和 StackPane 放入另一个 StackPane 后按钮不起作用

标签 java javafx layout

我试图在屏幕中间获取一个 TextField,同时在其周围有一个 Circle 以及圆圈​​下方的按钮。因此,我制作了一个带有圆圈和按钮的 VBox,以及仅带有 TextField 的 StackPane。我制作了另一个 StackPane 将 VBox 和 StackPane 放在同一场景中,但现在按钮不起作用。我真的不知道是什么原因造成的。

以下是迄今为止我的代码。

 * 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);
    }
    
}

最佳答案

你的第二个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);

image

还可以考虑使用 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);
    }
}

关于java - 将 VBox 和 StackPane 放入另一个 StackPane 后按钮不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64851163/

相关文章:

java - 如何将 2 个长值格式化为百分比格式?

java - 将 JScrollBar/JScrollPane 添加到此 JTextPane 时遇到问题

java - 在 javafx 中向文本字段添加特殊字符

java - 如何在 FXML 应用程序中主类和 Controller 类之间进行通信

java - 将数组分配给 JavaPoet 中的 MethodSpec 语句?

java - 请放心 : Extracting value from JSON Array

java - ControlsFX CheckComboBox 显示上的刷新问题

css - 为什么我的页脚宽度没有达到智能手机上的全宽?我正在使用 Wordpress

css - scss 加入类

html - 如何在每次更改为不同分辨率时保持容器大小不变?