2016-04-02 18 views
3

setText() benim açıklamalı etiketime start() yönteminden çağrılmaya çalışıyorum. Benzer bir soru gördüm, ancak bu kişi için işe yaramadı sebebi, onun etiketinin açıklanmamış olmasına rağmen benimkidir.NullPointer nullPointer İstisnası her şey düzgün yüklenir ve açıklamalı

java.lang.NullPointerException 
at io.github.blubdalegend.openbravery.OpenBravery.applyBuild(OpenBravery.java:67) 
at io.github.blubdalegend.openbravery.OpenBravery.start(OpenBravery.java:58) 
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(Unknown Source) 
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Unknown Source) 
at com.sun.javafx.application.PlatformImpl.lambda$null$173(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(Unknown Source) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

Bu benim ana sınıftır: Böyle

public class OpenBravery extends Application implements Initializable { 

    @FXML 
    private Button rerollButton; 

    @FXML 
    private Label champL; 

    public static void main(String[] args) { 
     System.out.println("Downloading files from Dropbox..."); 
     updateFiles(); 
     System.out.println("Download complete!"); 
     Application.launch(OpenBravery.class, (java.lang.String[]) null); 

    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     rerollButton.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 

      } 
     }); 
    } 

    private static void updateFiles() { 
     FileManager fm = new FileManager(); 
     fm.downloadChamps(); 
     fm.downloadItems(); 
    } 

    @Override 
    public void start(Stage stage) { 
     try { 
      Pane pane = (Pane) FXMLLoader.load(OpenBravery.class.getResource("build.fxml")); 
      Scene scene = new Scene(pane); 
      stage.setScene(scene); 
      stage.setTitle("OpenBravery"); 
      stage.setResizable(false); 
      applyBuild(); 
      stage.show(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private void applyBuild() { 
     Build build = new Build(); 
     champL.setText(build.getChamp()); 
    } 

} 

Benim build.fxml başlar:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.text.*?> 
<?import java.lang.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 


<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" 
    minWidth="-Infinity" prefHeight="297.0" prefWidth="362.0" 
    xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" 
    fx:controller="io.github.blubdalegend.openbravery.OpenBravery"> 
    <children> 
     <Label layoutX="14.0" layoutY="14.0" text="Your build:"> 
      <font> 
       <Font size="32.0" /> 
      </font> 
     </Label> 
     <Label fx:id="champL" layoutX="14.0" layoutY="61.0" prefHeight="32.0" 
      prefWidth="288.0" text="Label"> 
      <font> 
       <Font size="17.0" /> 
      </font> 
     </Label> 

Yani burada neyi özledin?

+0

'champL' muhtemelen hala boş mu? Başlatma emriyle bir ilgisi olabilir. –

+0

build.fxml bulamadığından şüpheliyim çünkü setText() satırı olmadan çalıştırdığımda sadece pencereyi yaratır (etiketin metnini ayarlamadan açıkça). Başlatma siparişinden emin değil. – Blub

+0

Garip, initialize() '' applyBuild() 'den önce çalıştırılmayacak mı? Eğer öyleyse, 'rerollButton' o zamana kadar boş değil. –

cevap

2

Denetleyicide applyBuild() öğesini çağırmıyorsunuz, bunu uygulama örneğinde çağırıyorsunuz. @FXML eklenmiş alanlar yalnızca denetleyicide başlatılır. Bu tür karışıklıklardan kaçınmak için kontrolörü ve uygulamayı ayrı sınıflar yapmak çok daha iyidir. Application sınıfının iki örneğini oluşturmak da kötü bir uygulamadır.

Denetleyici olarak ayrı bir sınıf yazın: denetleyici sınıfı olarak Application alt sınıfını kullanmayın.

+0

Oh vay, bu yüzden bu sınıfın iki örneği var mı? İkincisi nerede oluşturulur? –

+0

İkincisi, FXML dosyası, bu sınıfı denetleyici sınıfı olarak belirttiğinden, 'FXMLLoader' tarafından oluşturulur. –

+0

Bu ikinci Denetleyici nesnesine erişebilir mi? Örneğin. Denetleyici –