Javafx Break или обработчик событий кнопки остановки

Я все еще новичок в Java и JavaFX, и в данный момент я изо всех сил пытаюсь найти способ остановить/прервать событие, которое происходит при нажатии кнопки. Итак, я создаю программу, которая добавляет продукты (класс) в TableView. Пока все работает нормально, Товары успешно добавляются и их параметры проверяются моими пользовательскими функциями, вводил ли пользователь строковые/двойные/целочисленные значения соответственно в поля Имя/Цена/Количество.

В моей функции проверки также печатается ошибка, когда введенное значение неверно, НО я также хочу сделать так, чтобы при вводе неправильного значения все введенные данные в 3 поля были аннулированы/стерты. По этой причине каким-то образом обработчик события кнопки «Добавить» должен остановиться/прерваться. Я хочу сделать это, потому что даже если в консоли появится ошибка, что имя/цена/сумма введены неверно, другие значения, которые введены правильно, все равно будут печататься в таблице. Таким образом, в результате получаются данные, например, такие как: Имя: Цена рыбы: Количество: 3 ^ В случае, если значение Цена было не правильным двойным числом, а какой-то строкой или другим. У меня есть кнопка удаления, которая может удалить любые данные из таблицы, таким образом, неправильно введенные, но я хочу «сэкономить время» на этом или просто сделать программу «умнее». Я также забыл упомянуть, что моя функция checkString/Double/Int использует блок try/catch, поэтому я сделал так, что при возникновении ошибки будет напечатано сообщение и будет возвращено некоторое значение «по умолчанию» (поскольку функция требует возвращаемое значение). Но позвольте мне просто показать вам код:

Класс продукта:

public class Product{
private SimpleStringProperty name;
private SimpleDoubleProperty price;
private SimpleIntegerProperty amount;
//private SimpleIntegerProperty ID=0;

public Product(){
    this.name =new SimpleStringProperty("");
    this.price = new SimpleDoubleProperty(0);
    this.amount = new SimpleIntegerProperty(0);
    //this.ID=0;
}
public Product(String name, double price, int amount /* int id */){
    this.name =new SimpleStringProperty(name);
    this.price = new SimpleDoubleProperty(price);
    this.amount = new SimpleIntegerProperty(amount);
    //this.ID=id;
}

public SimpleStringProperty nameProperty() {
    return name;
}
public void setName(SimpleStringProperty name) {
    this.name = name;
}
public SimpleDoubleProperty priceProperty() {
    return price;
}
public void setPrice(SimpleDoubleProperty price) {
    this.price = price;
}
public SimpleIntegerProperty amountProperty() {
    return amount;
}
public void setAmount(SimpleIntegerProperty amount) {
    this.amount = amount;
}

}

Теперь кнопка «Добавить»:

//Add Button function
    addButton.setOnAction(e->{
        Product product = new Product();
        if(checkString(nameInput.getText()).equals(""))
        {
            //break the whole process 
        }
        else
        {
            //value is correct, so it will be saved
            product.setName(checkString(nameInput.getText()));
        }
        //product.setName(checkString(nameInput.getText()));
        product.setPrice(checkDouble(priceInput.getText()));
        product.setAmount(checkInt(amountInput.getText()));
        table.getItems().add(product);
        nameInput.clear();
        priceInput.clear();
        amountInput.clear();
    });

Вы можете видеть, что у меня есть 2 случая "setName". Первый - с оператором «если» и тем, как я хочу это сделать, или как я думал сделать это для определения того, когда процесс должен быть остановлен. Второй — это то, как это было раньше, и, как вы можете видеть, методы цены и количества одинаковы. Как только я выясню, как это сделать для свойства Name, я сделаю то же самое со свойствами Price и Amount. Вот 3 функции проверки, которые я написал:

public SimpleStringProperty checkString(String messageInput){
    SimpleStringProperty stringProperty = new SimpleStringProperty();
    try{
        Double.parseDouble(messageInput);
        System.err.println("You must input a proper name");
        stringProperty.setValue("");
        }
    catch(NumberFormatException e){
        stringProperty.setValue(messageInput);
    }
    return stringProperty;
}
public SimpleIntegerProperty checkInt(String messageInput){
    SimpleIntegerProperty integerProperty =  new SimpleIntegerProperty();
    try{
        integerProperty.setValue(Integer.parseInt(messageInput));

    }
    catch(NumberFormatException e){
        System.err.println("You must input a valid amount value");
        integerProperty.set(0);

    }
    return integerProperty;
}
public SimpleDoubleProperty checkDouble(String messageInput){
    SimpleDoubleProperty doubleProperty = new SimpleDoubleProperty();
    try{
        doubleProperty.setValue(Double.parseDouble(messageInput));
    }
    catch(NumberFormatException e){
        System.err.println("You must input a valid price value");
        doubleProperty.set(0);
    }
    return doubleProperty;

}

Сначала я хотел сделать 1 "универсальную" функцию проверки, но вроде бы это невозможно сделать с типами шаблонов и т. д., но это уже другая история.

Я был бы очень рад, если бы кто-нибудь мог мне помочь, если вам нужны другие части основного кода, просто спросите, но я думаю, что это соответствующие части.


person DracoGrim    schedule 11.05.2016    source источник


Ответы (2)


Если я правильно понимаю, я думаю, что перемещение кода за пределы if-else в else должно работать

И сделайте функцию проверки для каждого поля и используйте оператор &&, чтобы связать их (как вы уже сделали)

таким образом, когда поля неверны, вы ничего не делаете (или вы можете напечатать сообщение об ошибке)

person Sam Coutteau    schedule 11.05.2016
comment
Спасибо за комментарий. Очевидная вещь очевидна, но все равно работает не очень хорошо. Прежде всего, я изменил логический оператор из вашего предложения с && на || (ИЛИ), потому что даже если 1 из них неверный, то весь процесс должен остановиться, а с оператором И все 3 должны быть ложными, чтобы процесс остановился. Тем не менее, спасибо за идею. Теперь возникает проблема: по какой-то причине оператор if не работает и переходит к оператору else. Это должно быть что-то с возвращаемыми значениями функции equals(). - person DracoGrim; 11.05.2016

Прежде всего, ваша проверка условия неверна, checkString() возвращает SimpleStringProperty. Итак, при проверке условия if вам нужно выполнить checkString(value).getValue().equals("").

Вы можете использовать оператор return в if-блоке, чтобы вернуться, сделав что-нибудь. Нравиться

if(checkString(nameInput.getText()).getValue().equals("")) {
   return;
}
person Navaneeth    schedule 11.05.2016
comment
Дело в том, что для значений свойства integer и double функцию getValue() использовать нельзя. Я думаю, что мне нужно сделать другой способ проверки ошибок;/ - person DracoGrim; 11.05.2016