【问题标题】:JavaFX Button isn't clickableJavaFX 按钮不可点击
【发布时间】:2015-10-17 06:02:41
【问题描述】:

所以我有这个按钮。可以用回车键按下,也可以通过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();
}

}

【问题讨论】:

    标签: java user-interface javafx


    【解决方案1】:

    mouseTransparent 问题

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

    如果为真,则此节点(连同其所有子节点)对鼠标事件完全透明。为鼠标事件选择目标时,mouseTransparent 设置为 true 的节点及其子树将不会被考虑在内。

    您不需要setMouseTransparent(true) 电话;只需将其删除,“计算”按钮就会像您期望的那样可以点击。

    重叠组件问题

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

    所以改变:

    pane.add(hbox, 1, 4);
    

    收件人:

    pane.add(clearButton, 1, 4);
    

    调试帮助

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

    【讨论】:

    • 我删除了 setMouseTransparent,但由于某种原因,该按钮仍然不可点击。 clearButton 工作正常,但计算不能。
    • 第二个 HBox(包含清除按钮)也与计算按钮重叠。删除它并直接将清除按钮添加到您的网格后,一切正常。我附上截图:OS X 10.9, Java8u60。
    • 非常感谢兄弟,效果很好。也非常感谢您提供的调试技巧,这些都很棒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2015-09-26
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多