2014-09-12 3 views
0

안녕하세요 FXMLLoader를 통해 fxml 파일을로드하면 항상 오류가 발생합니다. 나는이 수업을 가지고있다 :FXML 파일을로드하는 StackOverflowError

package mediabox.app.model; 

import java.io.IOException; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 
import mediabox.app.controller.Controller; 

/** 
* Objekte diser Klasse repräsentieren Fenster 
* @author Christian 
*/ 
public class Window { 

    private final Stage stage; 

    /** 
    * 
    * @param resourceURL Pfad der zu ladenden FXML Datei 
    * @param controller Controller des Fensters 
    * @param height Höhe des Fensters 
    * @param width Breite des Fensters 
    * @param resizable Gibt an ob das Fenster maximierbar sein soll 
    * @param fullscreen Gibt an ob das Fenster als Vollbild geöffnet wird 
    * @throws IOException 
    */ 
    public Window(String resourceURL, Controller controller, int height, int width, boolean resizable, boolean fullscreen) throws IOException{ 
     FXMLLoader loader = new FXMLLoader(getClass().getResource(resourceURL)); //Lädt die zugehörige FXML 
     loader.setController(controller); 
     Parent root = (Parent)loader.load(); 
     Scene scene = new Scene(root, height, width); 
     stage = new Stage(); 
     stage.setResizable(resizable); 
     stage.setFullScreen(fullscreen); 
     stage.setScene(scene); 
    } 


    /** 
    * Zeigt das Fenster 
    */ 
    public void show(){ 
     stage.show(); 
    } 

    /** 
    * Versteckt das Fenster 
    */ 
    public void hide(){ 
     stage.hide(); 
    } 
} 

이것은 나의 윈도우 클래스 다.

 package mediabox.app.controller; 

import java.io.IOException; 
import java.net.URL; 
import java.sql.SQLException; 
import java.util.ResourceBundle; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.TableView; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.VBox; 
import javafx.scene.media.MediaView; 
import javax.naming.NamingException; 
import mediabox.app.model.DatabaseConnector; 
import mediabox.app.model.Music; 
import mediabox.app.model.Window; 
import mediabox.app.model.exceptions.ConnectionException; 

/** 
* FXML Controller class 
* Diese Klasse repräsentiert den MusicscreenController. Er steuert alle Aktion 
* die auf auf dem Musicscreen getätigt werden. D.h auch die Aktionen die 
* innerhalb der Tabelle(Datenbank) und der Playlist ausgeführt werden. 
* @author Christian 
*/ 
public final class MusicscreenController extends Controller implements Initializable { 

    @FXML private VBox box; 

    //@FXML private Node playlistNode; 
    @FXML private final TableView libraryNode; 
    @FXML private MediaView mediaPlayerView; 


    private final Window musicscreen; 

    public MusicscreenController() throws IOException { 
     musicscreen = new Window("/mediabox/app/view/MusicscreenView.fxml", this, 0, 0, false, true); 
     musicscreen.show(); 
     libraryNode = new TableView(); 
     initLibrary(); 
     libraryNode.requestFocus(); 
     libraryNode.getSelectionModel().selectFirst(); 

    } 

    /** 
    * Initialisiert die Bibliothek 
    */ 
    @Override 
    protected void initLibrary(){ 
     try { 
      DatabaseConnector.connectTo("src/mediabox/database/database"); 
      libraryNode.getItems().addAll(DatabaseConnector.loadEntries("Music")); // Einträge der Datenbank 
                      // auslesen und der library Node hinzufügen 
     } catch (SQLException | ConnectionException | NamingException | ClassNotFoundException ex) { 
      Logger.getLogger(MusicscreenController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    } 


    @FXML 
    public void onLibraryRequest(KeyEvent e){ 
     if(e.getCode().equals(KeyCode.ENTER)){ 
      try { 
       MediaPlayerController mediaPlayerController = new MediaPlayerController((Music)libraryNode.getSelectionModel().getSelectedItem()); 
      } catch (IOException ex) { 
       Logger.getLogger(MusicscreenController.class.getName()).log(Level.SEVERE, null, ex); 
      } 

     } 
    } 


} 

이것은 내 컨트롤러 클래스입니다.

이 코드에서 오류가 발견되지 않습니다. 당신이 FXML를로드 할 때 코드가 잘 작동 며칠 ....

-GhostfaceChilla-를 들어

답변

0

는 FXML 로더는 루트 요소에 fx:controller="mediabox.app.controller.MusicscreenController" 속성을 본다. 이것은 new MusciscreenController을 인스턴스화하도록 지시합니다. MusicscreenController의 생성자는 Window 생성자를 호출합니다. Window 생성자는 새 FXMLLoader을 만들고 load() 메서드를 호출합니다.이 메서드는 FXML을 구문 분석하여 새 MusicscreenController을 만듭니다.

그래서 무한 재귀가 있습니다.

당신은 아마 완전히 컨트롤러에서 생성자를 제거하고 initialize() 방법에 거기에서 논리의 대부분을 배치해야

:로, 당신은 정말 컨트롤러에서 윈도우를 표시 할 수 없습니다

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    initLibrary(); 
    libraryNode.requestFocus(); 
    libraryNode.getSelectionModel().selectFirst(); 
} 

모두 생성자 및 initialize 메서드는 FXML의 루트 노드를 Scene에 추가 할 수있는 기회를 갖기 전에 완료해야합니다.

그래서 당신도 바로 Window 생성자에서 show()를 호출한다 (또한. 그들이 Scene의 루트가 때 FXML - 컨트롤러 쌍을 사용할 수있을만큼 유연하게하려는 경우), 또는 당신이해야 Window 생성자를 호출 할 때마다 호출합니다.