2016-04-08 15 views
1

Lütfen çalışmama yardımcı olun. Sahneleri değiştirmek yerine donuyor.Javafx işlev aracılığıyla düğmeler nasıl oluşturulur?

Button b1 = new Button("Go to s2"); 
b1.setOnAction(e -> window.setScene(s2)); 
Button b2 = new Button("Go to s1"); 
b2.setOnAction(e -> window.setScene(s1)); 

Ama daha şık yapmak istiyorum ...

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.stage.Stage; 

public class Main extends Application { 

    Stage window; 
    Scene s1,s2; 

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

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     window = primaryStage; 

     Button b1 = makeButton("Go to s2", s2); 
     Button b2 = makeButton("Go to s1", s1); 

     s1 = new Scene(b1); 
     s2 = new Scene(b2); 

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

    public Button makeButton(String name, Scene destScene) { 
     Button button = new Button(name); 
     button.setOnAction(e -> window.setScene(destScene)); 
     return button; 
    } 
} 

önceden Çok teşekkür ederim: düğmeler bu şekilde oluşturulduğunda iyi çalışır! Her şey nasıl başlatılır için sırayla en

cevap

1

Görünüş: Eğer makeButton aradığınızda

Button b1 = makeButton("Go to s2", s2); 
Button b2 = makeButton("Go to s1", s1); 

s1 = new Scene(b1); 
s2 = new Scene(b2); 

, şu anda s1 ve s2 saklanan referans arasında değer geçirir. Hiçbir zaman başlatılmamış olduğundan, varsayılan değeri null alır. Bu, kopyalanan referans nedeniyle s1 ve s2 setini ayarladığınızda değişmez.

İlk durumda aynı soruna sahip değilsiniz, çünkü hiçbir zaman s1 ve s2'un bir kopyasını oluşturmazsınız. Bunun yerine, EventHandler adresinin geçerli olan Main örneğindeki alana bakın ve bunu ayarladığınızda doğru şekilde güncelleştirilir.

Button b1 = new Button("Go to s2"); 
b1.setOnAction(e -> window.setScene(this.s2)); 

Yani çok düğmenin referans yerine, çevreleyen Main örneğine başvuru kopyalıyorsun: Yani orijinal kod eşdeğer bir şeydir.

Maalesef bunun için önemsiz bir düzeltme göremiyorum. Ne istediğinizi olarak

Button b1 = makeButton("Go to s2", e -> window.setScene(s2)); 

olarak hoş değil, ancak çalışması gerekir: Anlıyorum kolay çözüm makeButton(String, EventHandler<ActionEvent>) için işlevini değiştirmek ve böyle diyoruz olacaktır.

Diğer bir çözüm de, tüm Button s öğelerinizi bir diziye koymak ve bu dizilimi makeButton içine geçirmektir. Yani üreterek bu gibi görünecektir:

public class Main extends Application { 
    Stage window; 
    Scene[] scenes = new Scene[2]; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     window = primaryStage; 

     Button b1 = makeButton("Go to s2", 1); 
     Button b2 = makeButton("Go to s1", 0); 

     scenes[0] = new Scene(b1); 
     scenes[1] = new Scene(b2); 

     primaryStage.setScene(scenes[0]); 
     primaryStage.show(); 
    } 

    public Button makeButton(String name, int destScene) { 
     Button button = new Button(name); 
     button.setOnAction(e -> window.setScene(scenes[destScene])); 
     return button; 
    } 
} 

ziyade yerel değişken (destScene) den Main (scenes) tarlası başvurmak için EventHandler değiştirir Yani.

İlgili konular