2012-11-03 78 views
13

Tôi phải tạo một ứng dụng trong đó nút thu nhỏ và tối đa hóa sẽ bị tắt.Làm thế nào để làm cho một cửa sổ undecorated di chuyển/kéo được trong JavaFX?

Tôi đã sử dụng "StageStyle.UNDECORATED" mà ứng dụng sẽ không thể di chuyển hoặc kéo được nữa, vì vậy tôi đang tìm kiếm bất kỳ giải pháp thay thế nào khác để tạo ứng dụng của mình.

Có ai có giải pháp cho việc này không?

+0

Liệu các tài sản trên ẩn thanh tiêu đề tất cả lại với nhau? Làm thế nào để bạn có kế hoạch kéo cửa sổ? – SoulMan

+0

Có NeilGhosh, thuộc tính trên ẩn toàn bộ thanh tiêu đề. –

Trả lời

20

Để đạt được cửa sổ bị undecorated nhưng vẫn di chuyển/có thể kéo, bạn phải xử lý MouseEvent thích hợp trên bất kỳ nút nào bạn chọn.

Ví dụ:

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(); 
    } 
} 

Tìm hiểu thêm từ các ví dụ rất có giá trị chứa trên trang tải về JavaFX của Oracle dưới: JavaFX Demos and Samples

+0

Có pmoule, đây là giải pháp tốt nhất cho vấn đề của tôi và thực sự hữu ích cho tôi. Cảm ơn bạn rất nhiều vì những nỗ lực của bạn. –

+0

Làm việc như thế, cảm ơn rất nhiều cho thời gian nghiên cứu của bạn ... chúng tôi đã sử dụng urs :-D – TechDog

0

Mục đích duy nhất của lớp học này là cho phép Window undecorated được kéo. Nó cũng thực hiện nhiệm vụ để đảm bảo TaskBar vẫn hiển thị với FullScreen, và đảm bảo cửa sổ undecorated không được kéo ra khỏi màn hình. Cuối cùng, nó cung cấp sửa lỗi cho lỗi "không tìm thấy tài nguyên css". Chỉ cần dán mã bên dưới vào lớp chính trong phương thức start() được ghi đè chỉ là khi Stage là ABOUT READY được hiển thị hoặc sau đó.

WindowStyle.allowDrag(root, stage); 
WindowStyle.stageDimension(stage.getWidth(), stage.getHeight()); 

LƯU Ý: Dán ở trên khi Giai đoạn là GIỚI THIỆU S READN SÀNG được hiển thị hoặc sau đó. Đối với sử dụng đầy đủ cửa sổ màn hình:

WindowStyle.fullScreen(Stage stage); 

Để thay đổi kích thước trở lại sử dụng theo thời gian:

WindowStyle.restoreScreen(Stage stage); 

Để thêm stylesheets tùy chỉnh để cảnh của bạn, Đơn giản chỉ cần dán bên dưới mã trong lớp chính trong khi bắt đầu ghi đè() sau khi xác định cảnh của bạn.

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

Tên của css được sử dụng để tạo kiểu tóc có thể theo hình thức: main.css hoặc styles/main.css

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; 
    } 
} 
Các vấn đề liên quan