2017-01-24 26 views
0

在我的示例中,我試圖創建一個計數器;JavaFX增加失敗的編號

它從0開始,每次我點擊它必須增加一個按鈕。

我添加一個PREFIX和比我的increaseNumber()方法必須運作,但它不起作用。

我是否創建了EventHandler false?

這裏是我的課:

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((O,ARG) - > { lbl2.setText(前綴+ 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());我想你已經刪除了'lbl2 = new Label(PREFIX + num.getZahl());'line?'); 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(); 
}