簡體   English   中英

誰能幫我調整 javaFX 場景的大小

[英]can anyone help me to resize the javaFX scene

我已經編寫了用於創建、更新、刪除和讀取功能的代碼,但現在使用分辨率為 1920 x 1080 的筆記本電腦編寫程序,window 窗格或階段看起來不錯,但如果我想在另一台分辨率較小的 PC 上運行或筆記本電腦我不知道如何使其響應或調整 window 的大小,以便所有按鈕、字段或圖像自動調整大小。

在互聯網上搜索我得到了一個代碼,但不知道如何將它實現到我的 FXdocument 文件中。

FXResizeHelper

package ServiceCenter;

import javafx.event.EventHandler;
import javafx.scene.Cursor;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.stage.Screen;
import javafx.stage.Stage;

import java.util.HashMap;

/**
 * @author Simon Reinisch
 * @version 0.0.2
 */
public class FXResizeHelper {

  private final HashMap<Cursor, EventHandler<MouseEvent>> LISTENER = new HashMap<>();
  private final Stage STAGE;
  private final Scene SCENE;
  private final int TR;
  private final int TM;
  private final double SCREEN_WIDTH, SCREEN_HEIGHT;

  private double mPresSceneX, mPresSceneY;
  private double mPresScreeX, mPresScreeY;
  private double mPresStageW, mPresStageH;

  private boolean mIsMaximized = false;
  private double mWidthStore, mHeightStore, mXStore, mYStore;

  /**
   * Create an FXResizeHelper for undecorated JavaFX Stages.
   * The only wish is your job is to create an padding for the Stage so the user can resize it.
   *
   * @param stage - The JavaFX Stage.
   * @param dt    - The area (in px) where the user can drag the window.
   * @param rt    - The area (in px) where the user can resize the window.
   */
  public FXResizeHelper(Stage stage, int dt, int rt) {
    this.TR = rt;
    this.TM = dt + rt;
    this.STAGE = stage;
    this.SCENE = stage.getScene();

    this.SCREEN_HEIGHT = Screen.getPrimary().getVisualBounds().getHeight();
    this.SCREEN_WIDTH = Screen.getPrimary().getVisualBounds().getWidth();

    createListener();
    launch();
  }

  /**
   * Minimize the stage.
   */
  public void minimize() {
    STAGE.setIconified(true);
  }

  /**
   * If the stage is maximized, it will be restored to the last position
   * with height and width. Otherwise it will be maximized to fullscreen.
   */
  public void switchWindowedMode() {
    if (mIsMaximized) {
      STAGE.setY(mYStore);
      STAGE.setX(mXStore);
      STAGE.setWidth(mWidthStore);
      STAGE.setHeight(mHeightStore);
    } else {
      mXStore = STAGE.getX();
      mYStore = STAGE.getY();
      mWidthStore = STAGE.getWidth();
      mHeightStore = STAGE.getHeight();

      STAGE.setY(0);
      STAGE.setX(0);
      STAGE.setWidth(SCREEN_WIDTH);
      STAGE.setHeight(SCREEN_HEIGHT);
    }
    mIsMaximized = !mIsMaximized;
  }

  private void createListener() {
    LISTENER.put(Cursor.NW_RESIZE, event -> {

      double newWidth = mPresStageW - (event.getScreenX() - mPresScreeX);
      double newHeight = mPresStageH - (event.getScreenY() - mPresScreeY);
      if (newHeight > STAGE.getMinHeight()) {
        STAGE.setY(event.getScreenY() - mPresSceneY);
        STAGE.setHeight(newHeight);
      }
      if (newWidth > STAGE.getMinWidth()) {
        STAGE.setX(event.getScreenX() - mPresSceneX);
        STAGE.setWidth(newWidth);
      }
    });

    LISTENER.put(Cursor.NE_RESIZE, event -> {

      double newWidth = mPresStageW - (event.getScreenX() - mPresScreeX);
      double newHeight = mPresStageH + (event.getScreenY() - mPresScreeY);
      if (newHeight > STAGE.getMinHeight()) STAGE.setHeight(newHeight);
      if (newWidth > STAGE.getMinWidth()) {
        STAGE.setX(event.getScreenX() - mPresSceneX);
        STAGE.setWidth(newWidth);
      }
    });

    LISTENER.put(Cursor.SW_RESIZE, event -> {

      double newWidth = mPresStageW + (event.getScreenX() - mPresScreeX);
      double newHeight = mPresStageH - (event.getScreenY() - mPresScreeY);
      if (newHeight > STAGE.getMinHeight()) {
        STAGE.setHeight(newHeight);
        STAGE.setY(event.getScreenY() - mPresSceneY);
      }
      if (newWidth > STAGE.getMinWidth()) STAGE.setWidth(newWidth);
    });

    LISTENER.put(Cursor.SE_RESIZE, event -> {
      double newWidth = mPresStageW + (event.getScreenX() - mPresScreeX);
      double newHeight = mPresStageH + (event.getScreenY() - mPresScreeY);
      if (newHeight > STAGE.getMinHeight()) STAGE.setHeight(newHeight);
      if (newWidth > STAGE.getMinWidth()) STAGE.setWidth(newWidth);
    });

    LISTENER.put(Cursor.E_RESIZE, event -> {
      double newWidth = mPresStageW - (event.getScreenX() - mPresScreeX);
      if (newWidth > STAGE.getMinWidth()) {
        STAGE.setX(event.getScreenX() - mPresSceneX);
        STAGE.setWidth(newWidth);
      }
    });

    LISTENER.put(Cursor.W_RESIZE, event -> {
      double newWidth = mPresStageW + (event.getScreenX() - mPresScreeX);
      if (newWidth > STAGE.getMinWidth()) STAGE.setWidth(newWidth);
    });

    LISTENER.put(Cursor.N_RESIZE, event -> {
      double newHeight = mPresStageH - (event.getScreenY() - mPresScreeY);
      if (newHeight > STAGE.getMinHeight()) {
        STAGE.setY(event.getScreenY() - mPresSceneY);
        STAGE.setHeight(newHeight);
      }
    });

    LISTENER.put(Cursor.S_RESIZE, event -> {
      double newHeight = mPresStageH + (event.getScreenY() - mPresScreeY);
      if (newHeight > STAGE.getMinHeight()) STAGE.setHeight(newHeight);
    });

    LISTENER.put(Cursor.OPEN_HAND, event -> {
      STAGE.setX(event.getScreenX() - mPresSceneX);
      STAGE.setY(event.getScreenY() - mPresSceneY);
    });
  }

  private void launch() {

    SCENE.setOnMousePressed(event -> {
      mPresSceneX = event.getSceneX();
      mPresSceneY = event.getSceneY();

      mPresScreeX = event.getScreenX();
      mPresScreeY = event.getScreenY();

      mPresStageW = STAGE.getWidth();
      mPresStageH = STAGE.getHeight();
    });

    SCENE.setOnMouseMoved(event -> {
      double sx = event.getSceneX();
      double sy = event.getSceneY();

      boolean l_trigger = sx > 0 && sx < TR;
      boolean r_trigger = sx < SCENE.getWidth() && sx > SCENE.getWidth() - TR;
      boolean u_trigger = sy < SCENE.getHeight() && sy > SCENE.getHeight() - TR;
      boolean d_trigger = sy > 0 && sy < TR;

      if (l_trigger && d_trigger) fireAction(Cursor.NW_RESIZE);
      else if (l_trigger && u_trigger) fireAction(Cursor.NE_RESIZE);
      else if (r_trigger && d_trigger) fireAction(Cursor.SW_RESIZE);
      else if (r_trigger && u_trigger) fireAction(Cursor.SE_RESIZE);
      else if (l_trigger) fireAction(Cursor.E_RESIZE);
      else if (r_trigger) fireAction(Cursor.W_RESIZE);
      else if (d_trigger) fireAction(Cursor.N_RESIZE);
      else if (sy < TM && !u_trigger) fireAction(Cursor.OPEN_HAND);
      else if (u_trigger) fireAction(Cursor.S_RESIZE);
      else fireAction(Cursor.DEFAULT);
    });
  }

  private void fireAction(Cursor c) {
    SCENE.setCursor(c);
    if (c != Cursor.DEFAULT) SCENE.setOnMouseDragged(LISTENER.get(c));
    else SCENE.setOnMouseDragged(null);
  }

}

我的入門代碼

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ServiceCenter;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleButton;
import javafx.scene.image.Image;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.util.Duration;
import tray.notification.NotificationType;
import tray.notification.TrayNotification;
import tray.animations.AnimationType;

/**
 * FXML Controller class
 *
 * @author Shafeen
 */
public class LoginController implements Initializable {

    @FXML
    private TextField txtUsername;
    @FXML
    private PasswordField password;
    @FXML
    private Button btnLogin;

    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }

    @FXML
    private void handleLoginEmployeePayroll(ActionEvent event) {
      
        try {
          

            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));

            Parent root1 = (Parent) fxmlLoader.load();

            root1.setStyle("-fx-background-color:   #2a3747;");
            Stage stage = new Stage();
            FXResizeHelper listener = new FXResizeHelper(stage, 100, 100);
            stage.initStyle(StageStyle.UNDECORATED);

            stage.setTitle("Home");
            stage.setScene(new Scene(root1));
            stage.show();

        } catch (Exception e) {
            System.out.println("Can't load new window");
        }

        Stage stage = (Stage) btnLogin.getScene().getWindow();
        stage.close();
    }

}

最簡單的做法是不要設置任何硬編碼大小,而是允許 JavaFX 為您計算大小,如果您需要硬編碼,setMaxSize() 和 setMinSize() 而不是設置硬編碼值。 如果您希望您的程序默認最大化,請使用 Stage.setMaximized()。 除非您的目標是一些非常舊的硬件,否則您應該沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM