摘要:中獲取并自定義窗口移動與縮放邏輯由于去掉了平臺自帶了標題欄,窗口就無法移動和縮放了,需要我們自己來實現。
JavaFx中Controller獲取Stage并自定義窗口移動與縮放邏輯
由于去掉了平臺自帶了標題欄,窗口就無法移動和縮放了,需要我們自己來實現。
去除窗口標題欄public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("main.fxml")); primaryStage.setTitle("main"); // 主要是這一句 primaryStage.initStyle(StageStyle.TRANSPARENT); primaryStage.setScene(new Scene(root)); primaryStage.show(); } public static void main(String[] args) { launch(args); } }在Controller中獲取Stage
首先確定在Controller中獲取到你的跟布局對象,如下:
public class Controller implements Initializable { public BorderPane root; private Stage stage; }
然后可以在public void initialize(URL url, ResourceBundle resourceBundle) 方法內獲取Stage
public class Controller implements Initializable { public BorderPane root; private Stage stage; @Override public void initialize(URL url, ResourceBundle resourceBundle) { var stage = getStage(); } private Stage getStage() { if (stage == null) { stage = (Stage) root.getScene().getWindow(); } return stage; } }自定義窗體移動與縮放邏輯
記錄鼠標坐標
root.setOnMousePressed(event -> { event.consume(); xOffset = event.getSceneX(); yOffset = event.getSceneY(); });
自定義移動控制區域
dragArea.setOnMouseDragged(event -> { event.consume(); var stage = getStage(); stage.setX(event.getScreenX() - xOffset); stage.setY(event.getScreenY() - yOffset); });
判斷鼠標坐標位置,并處理光標變換
root.setOnMouseMoved(this::mouseMoveHandle); private void mouseMoveHandle(MouseEvent event) { event.consume(); double x = event.getSceneX(); double y = event.getSceneY(); var stage = getStage(); double width = stage.getWidth(); double height = stage.getHeight(); Cursor cursorType = Cursor.DEFAULT; bit = 0; if (y >= height - RESIZE_WIDTH) { if (x <= RESIZE_WIDTH) { bit |= 1 << 3; } else if (x >= width - RESIZE_WIDTH) { bit |= 1; bit |= 1 << 2; cursorType = Cursor.SE_RESIZE; } else { bit |= 1; cursorType = Cursor.S_RESIZE; } } else if (x >= width - RESIZE_WIDTH) { bit |= 1 << 2; cursorType = Cursor.E_RESIZE; } root.setCursor(cursorType); }
處理窗口縮放
root.setOnMouseDragged(this::mouseDraggedHandle); private void mouseDraggedHandle(MouseEvent event) { event.consume(); var primaryStage = getStage(); double x = event.getSceneX(); double y = event.getSceneY(); double nextX = primaryStage.getX(); double nextY = primaryStage.getY(); double nextWidth = primaryStage.getWidth(); double nextHeight = primaryStage.getHeight(); if ((bit & 1 << 2) != 0) { nextWidth = x; } if ((bit & 1) != 0) { nextHeight = y; } if (nextWidth <= MIN_WIDTH) { nextWidth = MIN_WIDTH; } if (nextHeight <= MIN_HEIGHT) { nextHeight = MIN_HEIGHT; } primaryStage.setX(nextX); primaryStage.setY(nextY); primaryStage.setWidth(nextWidth); primaryStage.setHeight(nextHeight); }完整代碼
package line.main; import javafx.fxml.Initializable; import javafx.scene.Cursor; import javafx.scene.input.MouseEvent; import javafx.scene.layout.BorderPane; import javafx.scene.layout.Pane; import javafx.stage.Stage; import java.net.URL; import java.util.ResourceBundle; public class Controller implements Initializable { public BorderPane root; public Pane dragArea; private Stage stage; private double xOffset = 0; private double yOffset = 0; private int bit = 0;//left,right,top,bottom private static final double RESIZE_WIDTH = 5.00; private static final double MIN_WIDTH = 600.00; private static final double MIN_HEIGHT = 400.00; @Override public void initialize(URL url, ResourceBundle resourceBundle) { dragArea.setOnMouseDragged(event -> { event.consume(); var stage = getStage(); stage.setX(event.getScreenX() - xOffset); stage.setY(event.getScreenY() - yOffset); }); root.setOnMousePressed(event -> { event.consume(); xOffset = event.getSceneX(); yOffset = event.getSceneY(); }); root.setOnMouseMoved(this::mouseMoveHandle); root.setOnMouseDragged(this::mouseDraggedHandle); } private Stage getStage() { if (stage == null) { stage = (Stage) root.getScene().getWindow(); } return stage; } private void mouseMoveHandle(MouseEvent event) { event.consume(); double x = event.getSceneX(); double y = event.getSceneY(); var stage = getStage(); double width = stage.getWidth(); double height = stage.getHeight(); Cursor cursorType = Cursor.DEFAULT; bit = 0; if (y >= height - RESIZE_WIDTH) { if (x <= RESIZE_WIDTH) { bit |= 1 << 3; } else if (x >= width - RESIZE_WIDTH) { bit |= 1; bit |= 1 << 2; cursorType = Cursor.SE_RESIZE; } else { bit |= 1; cursorType = Cursor.S_RESIZE; } } else if (x >= width - RESIZE_WIDTH) { bit |= 1 << 2; cursorType = Cursor.E_RESIZE; } root.setCursor(cursorType); } private void mouseDraggedHandle(MouseEvent event) { event.consume(); var primaryStage = getStage(); double x = event.getSceneX(); double y = event.getSceneY(); double nextX = primaryStage.getX(); double nextY = primaryStage.getY(); double nextWidth = primaryStage.getWidth(); double nextHeight = primaryStage.getHeight(); if ((bit & 1 << 2) != 0) { nextWidth = x; } if ((bit & 1) != 0) { nextHeight = y; } if (nextWidth <= MIN_WIDTH) { nextWidth = MIN_WIDTH; } if (nextHeight <= MIN_HEIGHT) { nextHeight = MIN_HEIGHT; } primaryStage.setX(nextX); primaryStage.setY(nextY); primaryStage.setWidth(nextWidth); primaryStage.setHeight(nextHeight); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77410.html
摘要:故可采用自定義控件的方式簡化外部的代碼調用。自定義控件的設計版本之后,提供寫法,此時要求必須繼承自節點對象,使用加載時,必須調用方法。 「博客搬家」 原地址: 簡書 原發表時間: 2017-05-21 有一個項目,需要模擬數千臺設備的工作情況,這數千個設備分為若干組,每組 100 臺。故需要設計一款 GUI 程序,包含 100 個自定義控件,模擬一組設備的工作情況,通過 List...
摘要:創建窗口添加類為元素間空隙與主窗口創建過程相同,新建布局及控件,最后使用的方法顯示出來。設置主窗口中的按鈕事件,點擊按鈕后會顯示一個窗口。這時我們可以通過函數設置窗口關閉時觸發的事件在關閉窗口時,首先執行這一事件處理函數,再將窗口關閉。 前言 如今比較流行的桌面gui框架有WPF、WinForm、Qt、javafx等。其中WPF和WinForm目前還只能在運行Winsows上。Qt(w...
摘要:最近在用開發窗體程序,并且以后打算把所有的窗體軟件切換到上面,并且還想用的各種好處,集成了就可以愉快的用各種服務了。最重要的是打包工具。由于我是,一般用和,執行命令會看到打包成了和兩種類型的安裝包。由于沒有計算機,所以還不知道打包成的狀態。 最近在用 JavaFx 開發窗體程序,并且以后打算把所有的窗體軟件切換到 JavaFx 上面,并且還想用 springboot 的__各種好處,集...
匿名類 匿名類可以使你代碼更簡潔,它們使你能夠同時聲明和實例化一個類,它們就像局部類,除了它們沒有名稱,如果你只需要使用局部類一次,請使用它們。 聲明匿名類 雖然局部類是類聲明,但匿名類是表達式,這意味著你在另一個表達式中定義該類,以下示例HelloWorldAnonymousClasses在局部變量frenchGreeting和spanishGreeting的初始化語句中使用匿名類,但使用局部類...
摘要:背景項目需要做一個客戶端的殼,內置瀏覽器,訪問指定的采用技術開始吧環境配置略效果 背景 項目需要做一個客戶端的殼,內置瀏覽器,訪問指定 的url 采用技術 java 1.8 開始吧! java環境配置略 hello world import javafx.application.Application; import javafx.beans.value.ChangeListener;...
閱讀 3425·2021-09-22 16:00
閱讀 3470·2021-09-07 10:26
閱讀 3032·2019-08-30 15:55
閱讀 2869·2019-08-30 13:48
閱讀 1377·2019-08-30 12:58
閱讀 2180·2019-08-30 11:15
閱讀 959·2019-08-30 11:08
閱讀 536·2019-08-29 18:41