2017-01-24 18 views
0

В моем примере я пытаюсь создать счетчик;JavaFX Увеличение числа неудачных

Он начинается с 0 и каждый раз, когда я нажимаю кнопку, он должен увеличивать еще один.

Я добавляю PREFIX, и мой метод 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(); 
    } 

} 
+1

Зачем изобретать колесо? JavaFX уже имеет наблюдаемые свойства: нет необходимости использовать 'Observer' и' Observable'. Просто сделайте 'num'' IntegerProperty', а затем вы можете напрямую привязать текст метки к нему. См. Http://www.oracle.com/pls/topic/lookup?ctx=javase80&id=JFXBD107 –

+0

Я должен сделать следующее :( – meert

ответ

2

Если вы печатаете ваш сохраненный номер каждый раз, вы вызовете 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()); 
}); 
+0

Здравствуйте, Большое вам спасибо, но я попробовал, и он все еще не работает. И когда я написать; 'num.addObserver ((о, аг) -> { lbl2.setText (PREFIX + num.getZahl()); });' я адская исключения @Dth – meert

+0

Что что вы используете Java 8? Вы поместили его в метод 'init()' Я фактически скомпилировал его и работает так, как ожидалось. – Dth

+0

Я получаю это исключение: Исключение из потока «JavaFX Application Thread» java. lang.NullPointerException at ... at .. очень длинный Я добавляю это к 'num.addObserver ((o, arg) -> { lbl2.setText (PREFIX + num.getZahl()); }); initLabels() И да, я использую java 8 – meert

1

Это становится намного проще, если использовать свойство 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(); 
}