2015-10-16 185 views
0

所以我有这个按钮。它可以用回车键来按下,并且可以通过Tab键来选择,但是它不能被点击,并且就光标而言似乎不存在。我不相信任何东西可以覆盖它,但是大部分内容都会介绍一些方法,例如用相同的代码创建的按钮是可点击的。JavaFX Button不可点击

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

}

回答

6

mouseTransparent问题

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

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

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

calc

重叠部件文档

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

因此改变:

pane.add(hbox, 1, 4); 

要:

pane.add(clearButton, 1, 4); 

调试帮助

您可以通过调用layout.setStyle(“调试布局 - FX-背景色:绿色;“)来显示布局的范围,或者使用ScenicView

+0

我删除了setMouseTransparent,但由于某种原因,按钮仍然不可点击。 clearButton工作正常,但计算不成功。 – hydrozoah

+1

您的第二个HBox(包含清除按钮)也覆盖了计算按钮。删除后,直接添加清除按钮到你的网格一切工作正常。我附上了屏幕截图:OS X 10.9,Java8u60。 – jewelsea

+0

非常感谢,很好。非常感谢调试技巧,这些都很棒。 – hydrozoah