2012-11-03 20 views
13

Ich muss eine Anwendung erstellen, in der Schaltfläche Minimieren und Maximieren deaktiviert ist.Wie kann man ein undekoriertes Fenster in JavaFX verschieben/ziehen?

Ich habe "StageStyle.UNDECORATED" verwendet, mit dem die Anwendung nicht mehr beweglich oder ziehbar ist, also suche ich nach einer anderen Alternative, um meine Anwendung zu machen.

Wer hat eine Lösung dafür?

+0

Ist die obige Eigenschaft main.css oder styles/main.css versteckt die Titelleiste? Wie planen Sie, das Fenster zu ziehen? – SoulMan

+0

Ja NeilGhosh, die obige Eigenschaft verbirgt die gesamte Titelleiste. –

Antwort

20

Um zu erreichen, dass das Fenster nicht verziert, aber dennoch beweglich/schleppbar ist, müssen Sie die entsprechenden MouseEvent auf einem beliebigen Knoten Ihrer Wahl behandeln.

Beispiel:

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

public class SimpleWindowApplication extends Application { 
    private double xOffset = 0; 
    private double yOffset = 0; 

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

    @Override 
    public void start(final Stage primaryStage) { 
     primaryStage.initStyle(StageStyle.UNDECORATED); 
     BorderPane root = new BorderPane(); 

     root.setOnMousePressed(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       xOffset = event.getSceneX(); 
       yOffset = event.getSceneY(); 
      } 
     }); 
     root.setOnMouseDragged(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       primaryStage.setX(event.getScreenX() - xOffset); 
       primaryStage.setY(event.getScreenY() - yOffset); 
      } 
     }); 

     Scene scene = new Scene(root, 800, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
} 

Erfahren Sie mehr von den wertvollen Beispiele auf Oracles JavaFX Download-Seite enthalten sind unter: JavaFX Demos and Samples

+0

Ja pmoule, das ist die beste Lösung für mein Problem und ist wirklich sehr hilfreich für mich. Vielen Dank für Ihre Bemühungen. –

+0

Arbeitete einfach so, vielen Dank für Ihre Forschungszeit ... wir haben urs :-D genutzt – TechDog

0

Sole Zweck dieser Klasse ist undecorated Fenster zu ermöglichen gezogen werden. Es führt auch die Pflicht durch, sicherzustellen, dass TaskBar mit FullScreen sichtbar bleibt, und stellt sicher, dass das nicht verzierte Fenster nicht aus dem Bildschirm gezogen wird. Schließlich bietet es eine Fehlerbehebung für den Fehler "CSS-Ressource nicht gefunden." Einfach einfügen unter Code in der Hauptklasse in der überschriebenen start() -Methode, gerade wenn die Bühne über READY angezeigt wird oder nach.

HINWEIS: Fügen Sie die obigen, wenn die Bühne über BEREIT ist, um gezeigt oder nach. Für die Verwendung Vollbild-Fensters:

WindowStyle.fullScreen(Stage stage); 

Um zum vorherigen Gebrauch der Größe zurück:

WindowStyle.restoreScreen(Stage stage); 

benutzerdefinierte Stylesheets in der Szene hinzuzufügen, fügen Sie einfach Code unten in der Hauptklasse in dem überschriebenen start() Methode nach dem Definieren Ihrer Szene.

scene.getStylesheets().add(WindowStyle.addStyleSheet(String css)); 

Der Name von CSS für Styling verwendet werden kann in der Form: alle zusammen

import javafx.geometry.Rectangle2D; 
import javafx.scene.Parent; 
import javafx.scene.input.MouseEvent; 
import javafx.stage.Screen; 
import javafx.stage.Stage; 

/** 
* @author: BENJAH 
*/ 

public class WindowStyle { 
    private static final Rectangle2D SCREEN_BOUNDS= Screen.getPrimary() 
      .getVisualBounds(); 
    private static double[] pref_WH, offset_XY; 
    private static String styleSheet; 

    private WindowStyle(String css) { 
     styleSheet= getClass().getResource(css).toString(); 
    } 

    protected static void allowDrag(Parent root, Stage stage) { 
     root.setOnMousePressed((MouseEvent p) -> { 
      offset_XY= new double[]{p.getSceneX(), p.getSceneY()}; 
     }); 

     root.setOnMouseDragged((MouseEvent d) -> { 
      //Ensures the stage is not dragged past the taskbar 
      if (d.getScreenY()<(SCREEN_BOUNDS.getMaxY()-20)) 
       stage.setY(d.getScreenY() - offset_XY[1]); 
      stage.setX(d.getScreenX() - offset_XY[0]); 
     }); 

     root.setOnMouseReleased((MouseEvent r)-> { 
      //Ensures the stage is not dragged past top of screen 
      if (stage.getY()<0.0) stage.setY(0.0); 
     }); 
    } 

    //Sets the default stage prefered width and height. 
    protected static void stageDimension(Double width, Double height) { 
     pref_WH= new double[]{width, height}; 
    } 

    protected static void fullScreen(Stage stage) { 
     stage.setX(SCREEN_BOUNDS.getMinX()); 
     stage.setY(SCREEN_BOUNDS.getMinY()); 
     stage.setWidth(SCREEN_BOUNDS.getWidth()); 
     stage.setHeight(SCREEN_BOUNDS.getHeight()); 
    } 

    protected static void restoreScreen(Stage stage) { 
     stage.setX((SCREEN_BOUNDS.getMaxX() - pref_WH[0])/2); 
     stage.setY((SCREEN_BOUNDS.getMaxY() - pref_WH[1])/2); 
     stage.setWidth(pref_WH[0]); 
     stage.setHeight(pref_WH[1]); 
    } 

    protected static String addStyleSheet(String css) { 
     new WindowStyle(css); 
     return styleSheet; 
    } 
}