Есть ли альтернатива сложенным if для проверки множества пустых полей в приложении javafx? - PullRequest
0 голосов
/ 03 октября 2019

Я новичок в java (и программировании в целом) и учусь, преобразовывая базовую электронную таблицу в приложение javafx. Для этого я использую: Java & JavaFX 12 FXML и scenebuilder для графического интерфейса пользователя

Есть около 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


        }

}

1 Ответ

5 голосов
/ 03 октября 2019

Так или иначе, вам нужно связать одно поле с одной строкой. Это требует от вас добавления некоторого кода для каждого из TextField s, будь то установка userData в fxml или сохранение компоновки TextField и String в подходящей структуре данных в методе контроллера 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


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...