2016-08-08 77 views
2

Ich schreibe meine eigene Multimedia-Anwendung mit MultiMedia-Klassen von JavaFX 8. Wenn ich (am Anfang) mein Programm laufen lasse, möchte ich die Breite und Höhe meiner Stage gleichen wie die Breite und Höhe der Medien (Video) Ich möchte spielen.JavaFX MediaPlayer - Größe der Bühne

mp.setOnReady(new Runnable() { 
     @Override 
     public void run() { 
      Timeline slideIn = new Timeline(); 
      Timeline slideOut = new Timeline(); 

      stage.getScene().setOnMouseEntered(e -> { 
       slideIn.play(); 
      }); 

      stage.getScene().setOnMouseExited(e -> { 
       slideOut.play(); 
      }); 
      // here I get the width and heigth of the media 
      int w = mp.getMedia().getWidth(); 
      int h = mp.getMedia().getHeight(); 
      // width is 1280 and heigth is 720 (both values are correct) 
      if (w != 0 && h != 0) { 
       //Here Im setting the width and the height of stage 
       //But when I run my app, stage is a little bit smaller than 
       //MediaView and I have to resize the stage manually by cca 20px to get the whole view 
       stage.setWidth(w); 
       stage.setHeight(h); 
       stage.centerOnScreen(); 

       //On the other hand, animation works pretty well and 
       //correctly with the "w" and "h" 
       mediaBar.setMinSize(w - 100, 100); 
       mediaBar.setTranslateY(h - 100); 
       mediaBar.setTranslateX(50); 
       mediaBar.setOpacity(0); 

       slideIn.getKeyFrames().addAll(new KeyFrame(new Duration(0), new KeyValue(mediaBar.translateYProperty(), h), new KeyValue(mediaBar.opacityProperty(), 0.0)), 
         new KeyFrame(new Duration(300), new KeyValue(mediaBar.translateYProperty(), h - 100), new KeyValue(mediaBar.opacityProperty(), 0.9)) 
       ); 

       slideOut.getKeyFrames().addAll(new KeyFrame(new Duration(0), new KeyValue(mediaBar.translateYProperty(), h - 100), new KeyValue(mediaBar.opacityProperty(), 0.9)), 
         new KeyFrame(new Duration(300), new KeyValue(mediaBar.translateYProperty(), h), new KeyValue(mediaBar.opacityProperty(), 0.0)) 
       ); 

       background.setWidth(w - 100); 
       background.setHeight(100); 
       background.setTranslateY(h - 100); 
       background.setTranslateX(50); 
       background.setOpacity(0); 

       slideIn.getKeyFrames().addAll(new KeyFrame(new Duration(0), new KeyValue(background.translateYProperty(), h), new KeyValue(background.opacityProperty(), 0.0)), 
         new KeyFrame(new Duration(300), new KeyValue(background.translateYProperty(), h - 100), new KeyValue(background.opacityProperty(), 1)) 
       ); 

       slideOut.getKeyFrames().addAll(new KeyFrame(new Duration(0), new KeyValue(background.translateYProperty(), h - 100), new KeyValue(background.opacityProperty(), 1)), 
         new KeyFrame(new Duration(300), new KeyValue(background.translateYProperty(), h), new KeyValue(background.opacityProperty(), 0.0)) 
       ); 
      } else { 
       //music 
      } 
      duration = mp.getMedia().getDuration(); 
      updateValues(); 
     } 
    }); 

Also denke ich, dass es etwas Wichtiges über Stage Klasse, die ich noch nicht kenne.

Wenn ich initStyle von Stage auf StageStyle.UNDECORATED setze, dann kann ich das ganze MediaView sehen. Aber ich möchte diesen Stil nicht haben.

Könnte jemand mir helfen, dieses Problem zu lösen? Ich hoffe, ich habe mein Problem richtig beschrieben, denn dies ist meine erste Bitte um Hilfe. Vielen Dank.

Antwort

0

Dies ist, weil die Bühne Höhe und Breite die Dekoration enthält. Von den javadoc of widthProperty:

enthält Dieser Wert jegliche und alle Dekorationen, die von dem Betriebssystem wie veränderbare Rahmen Griffe hinzugefügt werden. In den typischen Anwendungen wird stattdessen die Szenenbreite eingestellt.

Und wie Sie sehen können, ist die Lösung auch in der Dokumentation: Sie könnten stattdessen die Größe der Scene setzen.

Dieses Beispiel öffnet eine Stage, die eine Scene mit der Größe von 400x400 einbettet.

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     try { 
      BorderPane root = new BorderPane(); 
      Scene scene = new Scene(root,400,400); 
      primaryStage.setTitle("Stage with 400x400 Scene"); 
      primaryStage.setScene(scene); 

      primaryStage.setOnShown(event -> System.out.println("Size of the Stage is " + primaryStage.getHeight() + "x" + primaryStage.getWidth())); 

      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

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

Ausgang ist

Size of the Stage is 438.0x416.0 

So wie Sie sehen können, wenn Sie die Größe der Scene die Stage eingestellt angezeigt wird, weil die Dekorationen größer sein.

Update: Gerade gefunden Ich hatte eine wirklich ähnliche Antwort hier: JavaFX: Set Scene min size excluding decorations