JavaFX 增加数量失败

JavaFX Increasing the number failed

在我的示例中,我试图制作一个计数器;

它从 0 开始,每次我点击按钮它必须增加一个。

我添加了一个前缀,然后我的 increaseNumber() 方法必须起作用,但它不起作用。

我创建的 EventHandler 是假的吗?

这是我的 类:

import java.util.Observable;

public class Number extends Observable {
    int number = 0;

    public int getZahl() {
        return number;
    }

    public void setZahl(int number) {
        this.number = number;
    }

    public void increaseTheNumber() {
        int oldNumber = number;
        number++;
        setChanged();
        notifyObservers(oldNumber);
    }

    public String toString() {
        return number + " ";
    }
}
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class NumberGUI extends Application {

    private Button btn;
    private Label lbl;
    private Label lbl2;
    private Number num;
    private static String PREFIX = "The new number is: ";

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void init() throws Exception {
        num = new Number();
        initButton();
        initLabels();

    }

    private void initButton() {
        btn = new Button();
        btn.setText("Click to Increase");
        btn.setPrefHeight(50);
        btn.setPrefWidth(200);
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                num.increaseTheNumber();
            }
        });

    }

    private void initLabels() {
        lbl2=new Label(PREFIX+num.getZahl());

    }

    private Parent createSceneGraph() { 
        BorderPane root = new BorderPane();
        root.setCenter(lbl);
        root.setBottom(lbl2);
        GridPane grid = new GridPane();
        grid.addColumn(0,btn);
        root.setCenter(grid);
        return root;
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Counter!");       
        primaryStage.setScene(new Scene(createSceneGraph(),300,250));
        primaryStage.show();

    }

}
public class Main {
    public static void main(String[] args) {
        Number num = new Number();
        ObserveNumber on = new ObserveNumber();
        num.addObserver(on);
        num.increaseTheNumber();
    }

}

如果您每次调用 increaseTheNumber 方法时都打印存储的数字,您会看到数字确实在增加。

public void increaseTheNumber() {
    int oldNumber = number;
    number++;
    setChanged();
    notifyObservers(oldNumber);
    System.out.println(number);
}

您的标签没有改变,因为您只设置了一次其内容,当时数字仍为零。

lbl2=new Label(PREFIX+num.getZahl());

由于您的 Number 是一个可观察对象,您可以向其添加一个 Observer,以便在每次收到通知时更新标签。

num.addObserver((o, arg) -> {
    lbl2.setText(PREFIX+num.getZahl());
});

如果您使用 JavaFX 属性,如 IntegerProperty,这将变得容易得多,因为这允许您简单地绑定 text 属性:

@Override
public void start(Stage primaryStage) {
    Label label = new Label();
    IntegerProperty property = new SimpleIntegerProperty(1);
    Button btn = new Button("Increment");
    btn.setOnAction((ActionEvent event) -> {
        // increment the property
        property.set(property.get()+1);
    });

    // format the property by prepending the prefix string
    label.textProperty().bind(property.asString("The new number is: %d"));

    Scene scene = new Scene(new VBox(label, btn));

    primaryStage.setScene(scene);
    primaryStage.show();
}