2017-01-24 1 views
0

Dans mon exemple, j'essaie de créer un compteur;JavaFX L'augmentation du nombre a échoué

Il commence par 0 et chaque fois que je clique sur le bouton, il doit être augmenté d'un de plus.

J'ajoute un PREFIX et ma méthode increaseNumber() doit fonctionner mais cela ne fonctionne pas.

Ai-je créé mon EventHandler false?

Voici mes classes:

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

} 
+1

Pourquoi réinventer la roue? JavaFX a déjà des propriétés observables: il n'est pas nécessaire d'utiliser 'Observer' et' Observable'. Faites juste 'num' et' IntegerProperty' et vous pouvez y attacher directement le texte de l'étiquette. Voir http://www.oracle.com/pls/topic/lookup?ctx=javase80&id=JFXBD107 –

+0

Je dois faire comme ceci :( – meert

Répondre

2

Si vous imprimez votre numéro enregistré chaque fois que vous invoquez méthode increaseTheNumber vous verrez que le nombre est en effet d'être augmenté.

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

Votre libellé ne change pas car vous ne définissez son contenu qu'une seule fois, lorsque le nombre est toujours égal à zéro.

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

Depuis votre Number est observable, vous pouvez ajouter un Observer à ce qui mettra à jour l'étiquette à chaque fois qu'il a été avisé.

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

Bonjour, Merci beaucoup mais je l'ai essayé et il ne fonctionne toujours pas. écrire, 'num.addObserver ((o, arg) -> { lbl2.setText (PREFIX + num.getZahl());} )' je reçois l'enfer d'une exception @Dth – meert

+0

Qu'est-ce que Utilisez-vous Java 8? L'avez-vous mis dans la méthode 'init()'? Je l'ai compilé et il fonctionne comme prévu – Dth

+0

Je reçois cette exception: Exception dans le fil "JavaFX Application Thread" java. lang.NullPointerException at ... at .. très long J'ajoute ceci à 'num.addObserver ((o, arg) -> { lbl2.setText (PREFIX + num.getZahl()); }); 'initLabels() Et oui j'utilise java 8 – meert

1

Cela devient beaucoup plus facile, si vous utilisez les propriétés JavaFX, comme IntegerProperty, car cela vous permet de lier simplement la propriété 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(); 
}