2016-05-11 9 views
0

Ich bin noch ein Anfänger in Java und JavaFX und ich habe im Moment Schwierigkeiten damit, ein Ereignis zu stoppen/zu brechen, das passiert, wenn eine Schaltfläche geklickt wird. Also, ich baue ein Programm, das Produkte (Klasse) zu einem TableView hinzufügt. Bisher funktioniert alles einwandfrei, die Produkte wurden erfolgreich hinzugefügt und ihre Parameter werden von meinen benutzerdefinierten Funktionen überprüft, unabhängig davon, ob der Benutzer string/double/integer Werte in die Felder Name/Preis/Betrag eingegeben hat.Javafx Break oder Stop Button Ereignishandler

In meiner Prüffunktion wird auch ein Fehler ausgegeben, wenn der eingegebene Wert falsch ist. ABER ich möchte es auch so machen, dass bei Eingabe eines falschen Wertes alle eingegebenen Daten in den 3 Feldern gelöscht/gelöscht werden . Aus diesem Grund muss der Event-Handler der Schaltfläche "Hinzufügen" irgendwie anhalten/brechen. Ich möchte dies tun, weil, selbst wenn ein Fehler in der Konsole erscheint, dass entweder der Name/Preis/Betrag falsch eingegeben wird, die anderen Werte, die korrekt eingegeben werden, immer noch in der Tabelle gedruckt werden. Daraus ergeben sich beispielsweise Daten wie: Name: Fish Preis: Betrag: 3 ^ Falls der Price-Wert keine korrekte Doppelnummer sondern irgendeine Zeichenfolge ist. Ich habe eine Löschtaste, die alle Daten aus der Tabelle entfernen kann, also die falsch eingegebene, aber ich möchte dafür "Zeit sparen" oder einfach das Programm "schlauer" machen. Ich habe auch vergessen zu erwähnen, dass meine checkString/Double/Int-Funktion try/catch-Block verwendet, also habe ich es so gemacht, dass, wenn ein Fehler auftritt, eine Nachricht gedruckt wird und einige "default" -Werte zurückgegeben werden (da die Funktion einen Rückgabewert benötigt). Aber lassen Sie mich nur den Code zeigen:

Produktklasse:

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; 
} 

} 

Nun ist die Schaltfläche "Hinzufügen":

//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(); 
    }); 

Sie können sehen, dass ich zwei Fälle "setName". Der erste ist der mit der "wenn" -Aussage und wie ich es machen will, oder wie ich darüber nachdenke, um festzustellen, wann der Prozess gestoppt werden muss. Die zweite ist, wie es früher war und wie Sie sehen können, dass Preis und Menge Methoden die gleichen sind. Sobald ich herausgefunden habe, wie es für die Name-Eigenschaft gemacht wird, mache ich dasselbe mit den Eigenschaften Preis und Betrag. Hier sind die drei Prüffunktionen, die ich schrieb:

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; 

} 

Zuerst wollte ich 1 „universal“ Prüffunktion machen, aber es scheint unmöglich zu sein, mit Template-Typen und usw. zu tun, aber das ist eine andere Geschichte .

Ich wäre wirklich froh, wenn mir jemand helfen kann, wenn Sie andere Teile des Hauptcodes einfach fragen müssen, aber ich denke, dass das die relevanten Teile sind.

Antwort

0

Wenn ich es richtig verstehe, denke ich den Code außerhalb des if-else in die andere sollte für jedes Feld

Arbeit und machen eine Prüffunktion zu bewegen und verwenden Sie die & & Operator sie zu verbinden (wie Sie bereits tat)

auf diese Weise, wenn die Felder nicht korrekt sind Sie nichts tun (oder man könnte einen Fehler msg)

+0

Danke für den Kommentar. Offensichtliche Sache ist offensichtlich, aber es funktioniert immer noch nicht ganz gut. Zuerst habe ich den logischen Operator von Ihrem Vorschlag von && in || geändert (ODER), auch wenn 1 davon falsch ist, dann muss der gesamte Prozess stoppen, während mit AND-Operator alle 3 falsch sein müssen, damit der Prozess stoppt. Trotzdem, danke für die Idee. Das Problem kommt nun, dass aus irgendeinem Grund die "if" -Anweisung nicht funktioniert und es zur "else" -Anweisung geht. Es muss etwas mit den Rückgabewerten der Funktion "equals()" sein. – DracoGrim

0

Zu allererst Ihre Zustandsprüfung ist falsch, checkString() gibt ein SimpleStringProperty drucken. Also in Ihrer if Zustandsprüfung müssen Sie checkString(value).getValue().equals("") tun.

Sie können eine Return-Anweisung in einem if-Block verwenden, um mit irgendetwas zurückzukommen. Wie

if(checkString(nameInput.getText()).getValue().equals("")) { 
    return; 
} 
+0

Die Sache ist, dass die Funktion "getValue()" für die Integer und Double-Eigenschaft Werte nicht verwendet werden kann. Ich denke, ich muss einen anderen Weg machen, diese Fehlerprüfung durchzuführen. – DracoGrim