2015-10-27 109 views
0

我有三个文本框tfNet,tfVat和tfGross。 (我的应用程序我做的所有与Java的钱在这个例子中双。)JavaFx8 3 TextField。在一个文本框上输入,更新另一个文本框

我想要什么: 当我改变热带水果网络应该更新

tfGross.setText("" + (Double.parseDouble(tfNet.getText()) * 
        (1 + Double.parseDouble(tfVat.getText())/100))); 

当我改变tfVat

tfNet.setText("" + (Double.parseDouble(tfGross.getText())/
        (1 + Double.parseDouble(tfVat.getText())/100))); 

当我改变tfGross

tfNet.setText("" + (Double.parseDouble(tfGross.getText())/
        (1 + Double.parseDouble(tfVat.getText())/100))); 

我尝试使用TextFormatter为所有三个Textfield,但陷入循环。

然后尝试与NumberBinding,但无法弄清楚如何做到这一点。

什么是JavaFx的方式来做到这一点?

1)将SimpleDoubleProperty绑定到文本字段并将addListener绑定到DoubleProperty?

2)或者TextField的setOnAction?

有没有简单的方法来做到这一点?

+0

我不明白的第三个要求。当你改变'tfGross'时,你想要改变'tfGross'?这不仅仅意味着你不希望用户能够编辑'tfGross'吗? –

+0

你是对的。我编辑第三个。 –

回答

0

您可以为每个TextField的textProperty()添加侦听器并在其中应用逻辑。

例如,你想改变监听器添加到tfNet情况下,你可以这样写:

tfNet.textProperty().addListener((ov, oldValue, newValue) -> { 
    // Proper checks for Text as Double 
    tfGross.setText("" + (Double.parseDouble(tfNet.getText()) * 
        (1 + Double.parseDouble(tfVat.getText())/100))); 
}); 
+0

这给写作带来麻烦。由于有'tfGross.textProperty ....'循环。但是,当我把它放在'if(tfNet.isFocused()){tfGross.setText ....'它按照它应该的方式工作。 –

+0

如果侦听器更改通知程序的状态,则会导致递归。我的建议是避免它。 – ItachiUchiha

+0

由于您的问题不是很清楚,我会大胆猜测,并说出您想要添加侦听器到'tfGross'和'tfVat'来更改第三个文本字段'tfNet'。因此,您必须将听众添加到前两个文本字段而不是第三个字段。 – ItachiUchiha

相关问题