JavaFx:如何同时在两个 GridPanes 节点上应用验证?
JavaFx: How to apply validation on two GridPanes nodes simultaneously?
我正在使用 Javafx 创建一个应用程序,其中我正在创建两个不同的 GridPanes,比如 GridPane A 和 GridPane B。在 GridPane A 中,我有 TextFields 和 GridPane B,我有 TextFields、复选框和 DatePickers,我在 运行 时间创建的所有节点。在 GridPanes A 和 B 下,我有一个这样的按钮:
我想要的是禁用按钮,直到 GridPane A 和 GridPane B 的条目都出现。我能够实现它,但只能在 GridPane A 上这样
首先检查 GridPane A 的所有 TextField 是否已填充且不为空:
private static boolean isAllFilled(GridPane tableA){
for(Node node : tableA.getChildren()){ // cycle through every component in the table (GridPane)
if(node instanceof TextField){ // if it's a TextField
// after removing the leading spaces, check if it's empty
if(((TextField)node).getText().trim().isEmpty()){
return false; // if so, return false
}
}
}
return true;
}
然后验证 TableA (GridPane A) 并添加侦听器:
private void validateTable(GridPane tableA, Button button) {
for(Node node : tableA.getChildren()){ // cycle through every component in the table (GridPane)
if(node instanceof TextField){ // if it's a TextField
((TextField)node).textProperty().addListener((obs, old, newV)->{ // add a change listener to every TextField
// then check if the new value is not empty AND all other TextFields are not empty
if(!newV.trim().isEmpty()&&isAllFilled(tableA)){
button.setDisable(false); // then make the button active again
}
else{
button.setDisable(true); // or else, make it disable until it achieves the required condition
}
});
}
}
}
我想同时在 GridPane A 和 GridPane B 上应用验证,就像现在我的程序正在验证 GridPane A 条目和 disabling/enabling 按钮但我想保持按钮禁用,除非 GridPane A 和GridPane B 条目已填充。
与检查 TextFields
是否 Filled in Table 的方式相同 A,您可以对第二个 [=33] 执行相同的操作=] (Table B):
// cycle through every component in tableA
private static boolean isAllFilled(GridPane tableA, GridPane tableB){
for(Node node : tableA.getChildren()){
if(node instanceof TextField){
if(((TextField)node).getText().trim().isEmpty()){
return false;
}
}
}
// cycle through every component in tableB
for(Node node : tableB.getChildren()){
if(node instanceof TextField){
if(((TextField)node).getText().trim().isEmpty()){
return false;
}
}
}
return true; // if all are filled / not empty
}
现在 TableA 或 TableB[=28= 中任何 TextField
的每一次更改], 它将检查两个表中的所有 TextFields
是否 Filled.
然后在validateTable
方法中添加tableB,像这样:
private void validateTable(GridPane tableA, GridPane tableB, Button button){
// add a change listener to every TextField in tableA
for(Node node : tableA.getChildren()){
if(node instanceof TextField){
((TextField)node).textProperty().addListener((obs, old, newV)->{
if(!newV.trim().isEmpty()&&isAllFilled(tableA, tableB)){
button.setDisable(false);
}
else{
button.setDisable(true);
}
});
}
}
// add a change listener to every TextField in tableB
for(Node node : tableB.getChildren()){
if(node instanceof TextField){
((TextField)node).textProperty().addListener((obs, old, newV)->{
if(!newV.trim().isEmpty()&&isAllFilled(tableA, tableB)){
button.setDisable(false);
}
else{
button.setDisable(true);
}
});
}
}
}
我正在使用 Javafx 创建一个应用程序,其中我正在创建两个不同的 GridPanes,比如 GridPane A 和 GridPane B。在 GridPane A 中,我有 TextFields 和 GridPane B,我有 TextFields、复选框和 DatePickers,我在 运行 时间创建的所有节点。在 GridPanes A 和 B 下,我有一个这样的按钮:
我想要的是禁用按钮,直到 GridPane A 和 GridPane B 的条目都出现。我能够实现它,但只能在 GridPane A 上这样
首先检查 GridPane A 的所有 TextField 是否已填充且不为空:
private static boolean isAllFilled(GridPane tableA){
for(Node node : tableA.getChildren()){ // cycle through every component in the table (GridPane)
if(node instanceof TextField){ // if it's a TextField
// after removing the leading spaces, check if it's empty
if(((TextField)node).getText().trim().isEmpty()){
return false; // if so, return false
}
}
}
return true;
}
然后验证 TableA (GridPane A) 并添加侦听器:
private void validateTable(GridPane tableA, Button button) {
for(Node node : tableA.getChildren()){ // cycle through every component in the table (GridPane)
if(node instanceof TextField){ // if it's a TextField
((TextField)node).textProperty().addListener((obs, old, newV)->{ // add a change listener to every TextField
// then check if the new value is not empty AND all other TextFields are not empty
if(!newV.trim().isEmpty()&&isAllFilled(tableA)){
button.setDisable(false); // then make the button active again
}
else{
button.setDisable(true); // or else, make it disable until it achieves the required condition
}
});
}
}
}
我想同时在 GridPane A 和 GridPane B 上应用验证,就像现在我的程序正在验证 GridPane A 条目和 disabling/enabling 按钮但我想保持按钮禁用,除非 GridPane A 和GridPane B 条目已填充。
与检查 TextFields
是否 Filled in Table 的方式相同 A,您可以对第二个 [=33] 执行相同的操作=] (Table B):
// cycle through every component in tableA
private static boolean isAllFilled(GridPane tableA, GridPane tableB){
for(Node node : tableA.getChildren()){
if(node instanceof TextField){
if(((TextField)node).getText().trim().isEmpty()){
return false;
}
}
}
// cycle through every component in tableB
for(Node node : tableB.getChildren()){
if(node instanceof TextField){
if(((TextField)node).getText().trim().isEmpty()){
return false;
}
}
}
return true; // if all are filled / not empty
}
现在 TableA 或 TableB[=28= 中任何 TextField
的每一次更改], 它将检查两个表中的所有 TextFields
是否 Filled.
然后在validateTable
方法中添加tableB,像这样:
private void validateTable(GridPane tableA, GridPane tableB, Button button){
// add a change listener to every TextField in tableA
for(Node node : tableA.getChildren()){
if(node instanceof TextField){
((TextField)node).textProperty().addListener((obs, old, newV)->{
if(!newV.trim().isEmpty()&&isAllFilled(tableA, tableB)){
button.setDisable(false);
}
else{
button.setDisable(true);
}
});
}
}
// add a change listener to every TextField in tableB
for(Node node : tableB.getChildren()){
if(node instanceof TextField){
((TextField)node).textProperty().addListener((obs, old, newV)->{
if(!newV.trim().isEmpty()&&isAllFilled(tableA, tableB)){
button.setDisable(false);
}
else{
button.setDisable(true);
}
});
}
}
}