2013-06-20 64 views
0

我的項目有一個帶有一些按鈕的主GUI(舞臺):右鍵單擊按鈕我想在另一個包中運行另一個舞臺。作爲對話框運行第二階段

這裏是項目樹

enter image description here

newprojectx是包主界面和

togglebuttonDraw.setOnMousePressed(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent mouseEvent) { 
     if (mouseEvent.isSecondaryButtonDown()){ 



     } 
     } 
    }); 

爲單擊鼠標右鍵的方法:我想從這個按鈕運行來自fibonaccipriceretracement包的.fxml。

togglebuttonDraw位於NewProjectXController類中。

任何幫助真的很感激。

編輯:這就是我想通過運行.fxml右擊

enter image description here

回答

2
FXMLLoader loader = new FXMLLoader(); 
loader.setLocation(getClass().getResource("/fibonaccipriceretracement/FibonacciPriceRetracementDialog.fxml")); 
Parent content = (Parent) loader.load(); 
Stage stage = new Stage(); 
stage.setScene(new Scene(content)); 
stage.show(); 
+0

嗨塞巴斯蒂安,謝謝:我得到這個異常 java.lang.IllegalStateException:位置沒有設置。 \t在javafx.fxml.FXMLLoader.load(FXMLLoader.java:2021) \t在newprojectx.NewProjectXController $ 1.handle(NewProjectXController.java:363) \t在newprojectx.NewProjectXController $ 1.handle(NewProjectXController.java:355) \t at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69) –

+0

爲什麼要創建一個窗格?我不應該用場景創建舞臺,然後調用Stage.show()? –

+0

嘿阿爾伯託,我在我的例子中犯了一個拼寫錯誤,因爲我不得不實際輸入它。它現在應該工作。我做了一個窗格,因爲我不知道你的fxml是怎麼樣的。如果你想要一個新的階段與fxml的內容,請再次檢查答案。 – Sebastian

0

對於小FXML是塞巴斯蒂安的解決方案是好的,但如果您遇到凍結當你打開彈出窗口時,也許FXML太大或者你正在通過網絡加載它。在這種情況下,FXMLLoader會阻止您的GUI,因此您需要在後臺執行FXMLLoader。您可以使用爲您的場景返回父項的服務,並在服務完成後將場景創建爲舞臺。

這是一個完整的例子:

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.concurrent.Service; 
import javafx.concurrent.Task; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.fxml.FXMLLoader; 
import javafx.geometry.Pos; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ProgressIndicator; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class Main extends Application { 
@Override 
public void start(Stage stage) throws Exception { 
    VBox vbox = new VBox(10); 
    vbox.setAlignment(Pos.CENTER); 

    final ProgressIndicator progress = new ProgressIndicator(-1); 
    progress.setVisible(false); 

    Button button = new Button("Open fxml"); 
    button.setOnAction(new EventHandler<ActionEvent>() {    
     @Override 
     public void handle(ActionEvent event) { 
      final Service<Parent> service = new Service<Parent>() {     
       @Override 
       protected Task<Parent> createTask() { 
        return new Task<Parent>() {       
         @Override 
         protected Parent call() throws Exception { 
          //Out of FX Thread 
          String fxml = "/FxmlTest.fxml"; 
          Parent root = FXMLLoader.load(getClass().getResource(fxml)); 
          return root; 
         } 
        }; 
       } 
      }; 
      progress.visibleProperty().bind(service.runningProperty()); 
      service.start(); 
      service.runningProperty().addListener(new ChangeListener<Boolean>() { 
       @Override 
       public void changed(ObservableValue<? extends Boolean> value, Boolean oldValue, Boolean newValue) {     
        if(!newValue){//The service has ended 
         //In the FX Thread 
         Stage stage = new Stage(); 
         Scene scene = new Scene(service.getValue()); 
         stage.setScene(scene); 
         stage.show(); 
        } 
       } 
      }); 
     } 
    }); 

    vbox.getChildren().addAll(button, progress); 

    Scene scene = new Scene(vbox); 
    stage.setScene(scene); 
    stage.show(); 
} 

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

我把一個進度指示器,以顯示該服務可以同時加載的時間。

如果你想檢查它在FX線程中的位置,你只需要使用Platform.isFxApplicationThread()。

希望它有幫助。

+0

謝謝安東尼奧,將仔細檢查您的代碼 –

+0

我試圖運行你的例子,但我得到最後的錯誤服務服務=新服務(),它說類型服務不採取參數 –

+0

您使用的是javafx.concurrent.Service嗎?我剛剛使用我正在使用的導入編輯了答案。我建議你看一下javafx 2教程http://docs.oracle.com/javafx/2/threads/jfxpub-threads。htm –

相關問題