2014-11-21 96 views
0

我在這裏有一些問題。JavaFX java.lang.IllegalStateException(Stage)

這是我的第一個屏幕代碼:

myps.initStyle(StageStyle.UNDECORATED); // I am trying to create a splash screen look a like 

現在我想把我的邊框和標題都回來了,所以我做這樣的事情:

// Exiting splash screen 
myps.hide(); 
myps.initStyle(StageStyle.DECORATED); // (Problem line) 

隨着思想hide()將設置我的舞臺可見性隱形,但問題線給我這個錯誤:

Cannot set style once stage has been set visible

如何將舞臺可見度設置爲隱形,以便我可以將邊框和窗口返回...或者您如何去做?我也是JavaFX的新手,新的是我如何精通的定義......

回答

1

由於消息說你「無法設置樣式一旦舞臺已設置可見」。

你需要做的是創造一個新的舞臺。詳情請看Designing a splash screen (java)。還有一些sample code in a gist,我將在這裏複製,以防止主要鏈接死亡。

import javafx.animation.FadeTransition; 
import javafx.application.Application; 
import javafx.beans.property.ReadOnlyObjectProperty; 
import javafx.collections.*; 
import javafx.concurrent.*; 
import javafx.geometry.*; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.effect.DropShadow; 
import javafx.scene.image.*; 
import javafx.scene.layout.*; 
import javafx.stage.*; 
import javafx.util.Duration; 
/** 
* Example of displaying a splash page for a standalone JavaFX application 
*/ 
public class FadeApp extends Application { 
    public static final String APPLICATION_ICON = 
      "http://cdn1.iconfinder.com/data/icons/Copenhagen/PNG/32/people.png"; 
    public static final String SPLASH_IMAGE = 
      "http://fxexperience.com/wp-content/uploads/2010/06/logo.png"; 

    private Pane splashLayout; 
    private ProgressBar loadProgress; 
    private Label progressText; 
    private Stage mainStage; 
    private static final int SPLASH_WIDTH = 676; 
    private static final int SPLASH_HEIGHT = 227; 

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

    @Override 
    public void init() { 
     ImageView splash = new ImageView(new Image(
       SPLASH_IMAGE 
     )); 
     loadProgress = new ProgressBar(); 
     loadProgress.setPrefWidth(SPLASH_WIDTH - 20); 
     progressText = new Label("Will find friends for peanuts . . ."); 
     splashLayout = new VBox(); 
     splashLayout.getChildren().addAll(splash, loadProgress, progressText); 
     progressText.setAlignment(Pos.CENTER); 
     splashLayout.setStyle(
       "-fx-padding: 5; " + 
       "-fx-background-color: cornsilk; " + 
       "-fx-border-width:5; " + 
       "-fx-border-color: " + 
        "linear-gradient(" + 
         "to bottom, " + 
         "chocolate, " + 
         "derive(chocolate, 50%)" + 
        ");" 
     ); 
     splashLayout.setEffect(new DropShadow()); 
    } 

    @Override 
    public void start(final Stage initStage) throws Exception { 
     final Task<ObservableList<String>> friendTask = new Task<ObservableList<String>>() { 
      @Override 
      protected ObservableList<String> call() throws InterruptedException { 
       ObservableList<String> foundFriends = 
         FXCollections.<String>observableArrayList(); 
       ObservableList<String> availableFriends = 
         FXCollections.observableArrayList(
           "Fili", "Kili", "Oin", "Gloin", "Thorin", 
           "Dwalin", "Balin", "Bifur", "Bofur", 
           "Bombur", "Dori", "Nori", "Ori" 
         ); 

       updateMessage("Finding friends . . ."); 
       for (int i = 0; i < availableFriends.size(); i++) { 
        Thread.sleep(400); 
        updateProgress(i + 1, availableFriends.size()); 
        String nextFriend = availableFriends.get(i); 
        foundFriends.add(nextFriend); 
        updateMessage("Finding friends . . . found " + nextFriend); 
       } 
       Thread.sleep(400); 
       updateMessage("All friends found."); 

       return foundFriends; 
      } 
     }; 

     showSplash(
       initStage, 
       friendTask, 
       () -> showMainStage(friendTask.valueProperty()) 
     ); 
     new Thread(friendTask).start(); 
    } 

    private void showMainStage(
      ReadOnlyObjectProperty<ObservableList<String>> friends 
    ) { 
     mainStage = new Stage(StageStyle.DECORATED); 
     mainStage.setTitle("My Friends"); 
     mainStage.getIcons().add(new Image(
       APPLICATION_ICON 
     )); 

     final ListView<String> peopleView = new ListView<>(); 
     peopleView.itemsProperty().bind(friends); 

     mainStage.setScene(new Scene(peopleView)); 
     mainStage.show(); 
    } 

    private void showSplash(
      final Stage initStage, 
      Task<?> task, 
      InitCompletionHandler initCompletionHandler 
    ) { 
     progressText.textProperty().bind(task.messageProperty()); 
     loadProgress.progressProperty().bind(task.progressProperty()); 
     task.stateProperty().addListener((observableValue, oldState, newState) -> { 
      if (newState == Worker.State.SUCCEEDED) { 
       loadProgress.progressProperty().unbind(); 
       loadProgress.setProgress(1); 
       initStage.toFront(); 
       FadeTransition fadeSplash = new FadeTransition(Duration.seconds(1.2), splashLayout); 
       fadeSplash.setFromValue(1.0); 
       fadeSplash.setToValue(0.0); 
       fadeSplash.setOnFinished(actionEvent -> initStage.hide()); 
       fadeSplash.play(); 

       initCompletionHandler.complete(); 
      } // todo add code to gracefully handle other task states. 
     }); 

     Scene splashScene = new Scene(splashLayout); 
     initStage.initStyle(StageStyle.UNDECORATED); 
     final Rectangle2D bounds = Screen.getPrimary().getBounds(); 
     initStage.setScene(splashScene); 
     initStage.setX(bounds.getMinX() + bounds.getWidth()/2 - SPLASH_WIDTH/2); 
     initStage.setY(bounds.getMinY() + bounds.getHeight()/2 - SPLASH_HEIGHT/2); 
     initStage.show(); 
    } 

    public interface InitCompletionHandler { 
     public void complete(); 
    } 
} 
+1

++ 1不只是給我思考的食物,但給了我也甜點的實現..idk如果我說的話是有道理的,但我所知道的是快樂..爾OLE .. – Elltz 2014-11-21 20:32:18

相關問題