2015-10-16 52 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