-1

我是 Java 新手(和一般编程),并且正在通过将基本电子表格转换为 javafx 应用程序来学习。为此,我正在使用:Java & JavaFX 12 FXML & scenebuilder for GUI

大约有 10 个输入字段,它们不能为空白(应用程序崩溃,因为 getText 似乎在空白字段上失败)。

我编写了堆叠的 if 语句来检查空白字段,如果是,则打印错误消息,并返回以停止进程而不会使应用程序崩溃。

Switch 语句似乎并不比 if 语句好。

有没有办法用更少的代码行来做到这一点?

package SteelDesign_BoltedConnection;

import javafx.fxml.FXML;
import javafx.scene.control.TextField;
import javafx.scene.control.DatePicker;
import javafx.scene.control.TextArea;
import javafx.event.ActionEvent;

public class mainController {

    //Header details
    @FXML   private TextField refNo;
    @FXML   private TextField jobDesc;
    @FXML   private TextField author;
    @FXML   private DatePicker date;

    //Design data
    @FXML   private TextField desShear;
    @FXML   private TextField boltSize;
    @FXML   private TextField boltGrade;
    @FXML   private TextField tensStrengthBolt;
    @FXML   private TextField noBolts;
    @FXML   private TextField shearPlanes;
    @FXML   private TextField edgeDist;
    @FXML   private TextField plyThick;
    @FXML   private TextField tensStrengthPly;

    //Constants
    @FXML   private TextField phiBolt;
    @FXML   private TextField phiPly;

    //Results - Bolt Shear
    @FXML   private TextField boltDesShear;
    @FXML   private TextField boltCap;
    @FXML   private TextField loadFactorBolt;

    //Results - Ply Shear & Bearing
    @FXML   private TextField plyDesShear;
    @FXML   private TextField plyCap;
    @FXML   private TextField loadFactorPly;

    //Output messages
    @FXML   private TextArea outputMsg;

    public void run(ActionEvent clickRun) {

        String outputMSG;

        //Check fields are populated
        if(desShear.getText().isBlank()) {
            outputMSG = "Design shear field is blank";
            outputMsg.setText(outputMSG);
            return;
        }
        else if(boltSize.getText().isBlank()) {
            outputMSG = "Bolt size field is blank";
            outputMsg.setText(outputMSG);
            return;
        }
        else if(tensStrengthBolt.getText().isBlank()) {
            outputMSG = "Bolt strength field is blank";
            outputMsg.setText(outputMSG);
            return;
        }
        else if(noBolts.getText().isBlank()) {
            outputMSG = "Number of bolts field is blank";
            outputMsg.setText(outputMSG);
            return;
        }
        else if(shearPlanes.getText().isBlank()) {
            outputMSG = "Number of shear planes field is blank";
            outputMsg.setText(outputMSG);
            return;
        }
        else if(edgeDist.getText().isBlank()) {
            outputMSG = "Edge distance field is blank";
            outputMsg.setText(outputMSG);
            return;
        }
        else if(plyThick.getText().isBlank()) {
            outputMSG = "Ply thickness field is blank";
            outputMsg.setText(outputMSG);
            return;
        }
        else if(tensStrengthPly.getText().isBlank()) {
            outputMSG = "Ply strength field is blank";
            outputMsg.setText(outputMSG);
            return;
        }
        else if(phiBolt.getText().isBlank()) {
            outputMSG = "Bolt phi factor field is blank";
            outputMsg.setText(outputMSG);
            return;
        }
        else if(phiPly.getText().isBlank()) {
            outputMSG = "Ply phi factor field is blank";
            outputMsg.setText(outputMSG);
            return;
        }

        //Get field values
        double desSHEAR = Double.parseDouble(desShear.getText());
        double boltSIZE = Double.parseDouble(boltSize.getText());
        double tensStengthBOLT = Double.parseDouble(tensStrengthBolt.getText());
        double noBOLTS = Double.parseDouble(noBolts.getText());
        double shearPLANES = Double.parseDouble(shearPlanes.getText());
        double edgeDIST = Double.parseDouble(edgeDist.getText());
        double plyTHICK = Double.parseDouble(plyThick.getText());
        double tensStrengthPLY = Double.parseDouble(tensStrengthPly.getText());
        double phiBOLT = Double.parseDouble(phiBolt.getText());
        double phiPLY = Double.parseDouble(phiPly.getText());

        //Bolt shear calculation


        }

}
4

1 回答 1

5

您需要以一种或另一种方式将一个字段与一个字符串相关联。这需要您为每个TextFields 添加一些代码,无论是userData在 fxml 中设置,还是在控制器方法中存储组合TextFieldString合适的数据结构。initialize

这样的数据结构可以是LinkedHashMap

private final Map<TextField, String> fieldStrings = new LinkedHashMap<>();

@FXML
private void initialize() {
    fieldStrings.put(desShear, "Design shear");
    fieldStrings.put(boltSize, "Bolt size");
    fieldStrings.put(tensStrengthBolt, "Bolt strength");
    fieldStrings.put(noBolts, "Number of bolts");
    fieldStrings.put(shearPlanes, "Number of shear planes");
    fieldStrings.put(edgeDist, "Edge distance");
    fieldStrings.put(plyThick, "Ply thickness");
    fieldStrings.put(tensStrengthPly, "Ply strength");
    fieldStrings.put(phiBolt, "Bolt phi factor");
    fieldStrings.put(phiPly, "Ply phi factor");
}

private double getFieldValue(TextField field) {
    return Double.parseDouble(field.getText());
}

public void run(ActionEvent clickRun) {

    String errorField = fieldStrings.entrySet().stream()
                                     .filter(entry -> entry.getKey().getText().isBlank())
                                     .map(Map.Entry::getValue)
                                     .findFirst().orElse(null);

    if (errorField != null) {
        outputMsg.setText(errorField + " field is blank");
        return;
    }

    //Get field values
    double desSHEAR = getFieldValue(desShear);
    double boltSIZE = getFieldValue(boltSize);
    double tensStengthBOLT = getFieldValue(tensStrengthBolt);
    double noBOLTS = getFieldValue(noBolts);
    double shearPLANES = getFieldValue(shearPlanes);
    double edgeDIST = getFieldValue(edgeDist);
    double plyTHICK = getFieldValue(plyThick);
    double tensStrengthPLY = getFieldValue(tensStrengthPly);
    double phiBOLT = getFieldValue(phiBolt);
    double phiPLY = getFieldValue(phiPly);


    //Bolt shear calculation


}
于 2019-10-03T08:20:24.283 回答