当前位置: 首页 > 知识库问答 >
问题:

Javafx中断或停止按钮事件处理程序

曾骁
2023-03-14

我仍然是Java和JavaFX的初学者,目前我正在努力寻找一种方法来阻止/中断单击按钮时发生的事件。因此,我正在构建一个程序,将产品(类)添加到TableView中。到目前为止,一切正常,产品添加成功,其参数由我的自定义函数检查,用户是否在名称/价格/金额字段中分别输入了字符串/双精度/整数值。

在我的检查功能中,当输入的值不正确时,也会打印一个错误,但我也希望这样做,以便在输入不正确的值时,3个字段中输入的所有数据都会被清空/擦除。因此,“Add”按钮的事件处理程序需要停止/中断。我想这样做,因为即使控制台中出现错误,名称/价格/金额输入错误,其他正确输入的值仍将打印在表中。例如,如果价格值不是正确的双倍数字,而是某个字符串或其他字符串,则会生成诸如:Name:Fish Price:Amount: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();
    });

您可以看到我有两个案例“setName”。第一个是with“if”语句以及我想如何执行它,或者我想如何执行它以检测进程何时需要停止。第二个是它过去的样子,正如您所看到的,Price和金额方法是相同的。一旦我弄清楚如何为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个“通用”检查功能,但似乎无法使用模板类型等,但那是另一回事。

如果有人能帮助我,我会非常高兴,如果你需要主代码的其他部分,尽管问吧,但我认为这些都是相关的部分。

共有2个答案

山翼
2023-03-14

首先你的条件检查是错误的,check String()返回一个SimpleStringProperty。所以在你的if条件检查中,你需要做check String(value). getValue(). equals(")

您可以在if块中使用return语句来执行任何操作。喜欢

if(checkString(nameInput.getText()).getValue().equals("")) {
   return;
}
濮阳钟展
2023-03-14

如果我理解正确,我认为将if-ore之外的代码移动到其他地方应该可以工作

并为每个字段创建一个检查函数,并使用

这样,当字段不正确时,您无需执行任何操作(或者您可以打印错误msg)

 类似资料:
  • 上周我刚开始使用JavaFx,但在尝试在窗格中设置圆圈以响应按钮事件处理程序时遇到了问题。我有左、右、上、下名称的按钮设置,按下时应该会在窗格内移动圆圈。我的问题是我根本无法让圆圈响应我的事件处理程序。我看到了另一个包含按键移动圆圈的教程,我正在尝试类似的东西,但用按钮代替。任何帮助我走向正确方向的帮助都将非常感谢。

  • 我的一段代码 下一条语句的错误为

  • 我正在使用javafx创建一个扫雷克隆,如果有人玩过原始游戏,他们可能会记得当你按下一个磁贴并四处移动时,其他磁贴的行为就好像它们也在被按下一样...如果你放手-即使你最初按下的是一个完全不同的节点,你鼠标当前所在的节点也会被点击。我很难重新创建这个,我需要一些帮助。 我正在使用全局事件处理程序类,我不太确定这是好是坏......但是,让我的克隆的事件单独处理感觉很好。我尝试过在事件发生的节点上使

  • 问题内容: 我在JavaFX中有一个舞台,可以通过多种方式关闭该舞台,方法是单击红色(X)或通过一个调用 无论舞台如何关闭,我都希望在舞台关闭之前(或之后)执行操作。 如果我使用以下代码: 然后当我单击(X)时调用处理程序,但当我调用 不同之处在于,他希望在整个应用程序关闭时调用处理程序,因此可以覆盖的方法。但是,我并没有关闭整个应用程序,只是一个阶段。并且没有重写的方法。 谢谢你的帮助。 问题答

  • 我们有一个使用Disruptor框架的系统,它有五个注册阶段来实现EvenetHandler。 阶段按顺序工作,因此请求只能在第一阶段完成时移动到第二阶段,该移动由Disruptor内部维护。 我们对第三阶段有问题,这是瓶颈,需要大量时间,因为它进行不同的HTTP调用并将响应存储在请求对象中。 因此,我们希望在第三阶段花了一段时间之后,将请求(无论有什么响应)提前到第四和第五阶段。 如何超时任何特

  • 我试图在JavaFX中重现一个JavaScript游戏的一些行为。该程序有几个数字文本字段,可以在游戏运行时进行编辑。它在运行时也接受字母键盘命令。 macOS、Java17、JavaFX17。