JavaFX 按钮不可点击

标签 java user-interface javafx

所以我有这个按钮。可以用 Enter 键按下它,也可以通过 Tab 键选择它,但无法单击它,并且就光标而言似乎不存在。我不相信有任何东西覆盖它,但它大多数都以某种方式被覆盖,因为使用相同代码创建的按钮是可单击的。

public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
    primaryStage.setTitle("Mortgage Calculator");

    GridPane pane = new GridPane();
    pane.setAlignment(Pos.CENTER);
    pane.setHgap(10);
    pane.setVgap(10);
    pane.setPadding(new Insets(25, 25, 25, 25));
    Scene scene = new Scene(pane, 350, 325);

    Text sceneTitle = new Text("Mortgage Calculator");
    sceneTitle.setFont(Font.font("Arial", FontWeight.NORMAL, 20));
    pane.add(sceneTitle, 0, 0, 2, 1);
    Label total = new Label("Value of your Mortgage:");
    pane.add(total, 0, 1);
    final TextField totalField = new TextField();
    pane.add(totalField, 1, 1);
    Label percent = new Label("% Interest:");
    pane.add(percent, 0, 2);
    final TextField percentField = new TextField();
    pane.add(percentField, 1, 2);
    Label time = new Label("Length of mortgage:");
    pane.add(time, 0, 3);
    final TextField timeField = new TextField();
    pane.add(timeField, 1, 3);
    final Text amountOwed = new Text();
    pane.add(amountOwed, 1, 7);
    final Text payment = new Text();
    pane.add(payment, 1, 8);

    Button calculateButton = new Button("Calculate");
    HBox hbox1 = new HBox(10);
    hbox1.setAlignment(Pos.BOTTOM_RIGHT);
    hbox1.getChildren().add(calculateButton);
    calculateButton.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            double principal = Double.parseDouble(totalField.getText());
            double interest = (Double.parseDouble(percentField.getText()) / 100) / 12;
            int time = Integer.parseInt(timeField.getText());
            int numPayment = time * 12;

            double monthlyPayment = (principal * (interest * (Math.pow((interest + 1), numPayment)))) / (Math.pow((1 + interest), numPayment) - 1);
            //double totalPayment = ;
            //amountOwed.setText("Amount owed is: " + totalPayment);
            payment.setText("Monthly payment is: $" +  (int)Math.ceil(monthlyPayment));
        }
    });
    pane.add(hbox1, 1, 4);

    Button clearButton = new Button("Clear");
    HBox hbox = new HBox(10);
    hbox.setAlignment(Pos.BOTTOM_LEFT);
    hbox.getChildren().add(clearButton);
    pane.add(hbox, 1, 4);
    EventHandler<ActionEvent> handler1 = new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            totalField.setText("");
            percentField.setText("");
            timeField.setText("");
            payment.setText("");
        }
    };
    clearButton.setOnAction(handler1);
    primaryStage.setScene(scene);
    primaryStage.show();
}

}

最佳答案

鼠标透明问题

您将“计算”按钮放入 HBox 中,然后调用 setMouseTransparent(true)在 HBox 上。这样的调用将禁用 HBox 及其所有子项上的鼠标输入。此行为记录在链接的 Javadoc 中:

If true, this node (together with all its children) is completely transparent to mouse events. When choosing target for mouse event, nodes with mouseTransparent set to true and their subtrees won't be taken into account.

您不需要 setMouseTransparent(true) 调用;只需将其删除,“计算”按钮就可以按您的预期点击。

calc

重叠组件问题

您还需要确保某些组件不会与其他组件重叠,否则只有顶部组件可单击。在您的情况下,包含“清除”按钮的 HBox 与“计算”按钮重叠。

所以改变:

pane.add(hbox, 1, 4);

致:

pane.add(clearButton, 1, 4);

调试协助

您可以通过调用layout.setStyle("-fx-background-color: green;")来调试布局以显示布局的范围,或者使用ScenicView .

关于JavaFX 按钮不可点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33178814/

相关文章:

java - 使用java反射调用setter方法

java - 用于 Java 代码的 SPARQL 解析器

java - OpenCV 应用程序 - Android 相机一直显示黑屏

java - 绑定(bind)list.contains()方法的结果

java - 在JAVA中重新绘制Applet,而不丢失以前的内容

java - Vaadin 窗口调整大小和组件内部自动对齐

javascript - 从两种颜色计算对比色以确定两者的边框颜色

javascript - 在两个可拖动的 Flatlist-React Native 之间拖放

java - 尝试为单个 ListView 单元格设置样式时遇到困难,例如聊天应用程序

java - 当焦点舞台发生变化时获得通知