javaFX中的Stage窗口怎么最大化、最小化?

第三方89 2014-01-02 09:37:35
javaFX中的Stage窗口怎么使用程序而不是用户操作界面最大化/最小化?
stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!
...全文
1655 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
KennycdjjMicr 2014-01-27
  • 打赏
  • 举报
回复
那东西有很多限制的嘛
fearlessMore 2014-01-07
  • 打赏
  • 举报
回复
引用 15 楼 huntor 的回复:
[quote=引用 14 楼 KennycdjjMicr 的回复:] javaFX是什么呢,我还没用过,这玩意用的人多么,是做什么的
Java新一代GUI[/quote]嗯,比Swing简单使用,但是还是有很多bugs和许多没有公开的api和Css
huntor 2014-01-06
  • 打赏
  • 举报
回复
引用 14 楼 KennycdjjMicr 的回复:
javaFX是什么呢,我还没用过,这玩意用的人多么,是做什么的
Java新一代GUI
KennycdjjMicr 2014-01-06
  • 打赏
  • 举报
回复
javaFX是什么呢,我还没用过,这玩意用的人多么,是做什么的
第三方89 2014-01-04
  • 打赏
  • 举报
回复
引用 11 楼 huntor 的回复:
import javafx.application.Application;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.event.*;

public class CloseFXWindow extends Application {
  public static void main(final String... args) {
    Application.launch(CloseFXWindow.class, args);
  }

  @Override public void start(final Stage stage) {
    stage.setTitle("FX Close");
    Button close = ButtonBuilder.create().text("Close").onAction(new EventHandler<ActionEvent>(){
        @Override public void handle(ActionEvent e){
          Event.fireEvent(stage, new WindowEvent(stage, WindowEvent.WINDOW_CLOSE_REQUEST ));
        }
      }).build();
    Button hidden = ButtonBuilder.create().text("Hidden").onAction(new EventHandler<ActionEvent>(){
            @Override public void handle(ActionEvent e){
                stage.setIconified(true);
            }
        }).build();
	Button full = ButtonBuilder.create().text("Full Screen").onAction(new EventHandler<ActionEvent>(){
			@Override public void handle(ActionEvent e){
				stage.setFullScreen(true);
			}
		}).build();
    Button max = ButtonBuilder.create().text("Max").onAction(new EventHandler<ActionEvent>(){
            @Override public void handle(ActionEvent e){
                javafx.geometry.Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
                stage.setX(primaryScreenBounds.getMinX());
                stage.setY(primaryScreenBounds.getMinY());
                stage.setWidth(primaryScreenBounds.getWidth());
                stage.setHeight(primaryScreenBounds.getHeight());
            }
        }).build();
	VBox vbox = new VBox(8);
	vbox.getChildren().addAll(close, hidden, max, full);
    Group root = new Group(vbox);
    Scene scene = SceneBuilder.create().root(root).width(400).height(300).build();
    stage.setScene(scene);
    stage.show();
  }
}
我就是只能实现这种才来问的。 Stage hide()后,事件就阻塞了。能不能设置Stage让它不这样?
fearlessMore 2014-01-04
  • 打赏
  • 举报
回复
引用 11 楼 huntor 的回复:
import javafx.application.Application;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.event.*;

public class CloseFXWindow extends Application {
  public static void main(final String... args) {
    Application.launch(CloseFXWindow.class, args);
  }

  @Override public void start(final Stage stage) {
    stage.setTitle("FX Close");
    Button close = ButtonBuilder.create().text("Close").onAction(new EventHandler<ActionEvent>(){
        @Override public void handle(ActionEvent e){
          Event.fireEvent(stage, new WindowEvent(stage, WindowEvent.WINDOW_CLOSE_REQUEST ));
        }
      }).build();
    Button hidden = ButtonBuilder.create().text("Hidden").onAction(new EventHandler<ActionEvent>(){
            @Override public void handle(ActionEvent e){
                stage.setIconified(true);
            }
        }).build();
	Button full = ButtonBuilder.create().text("Full Screen").onAction(new EventHandler<ActionEvent>(){
			@Override public void handle(ActionEvent e){
				stage.setFullScreen(true);
			}
		}).build();
    Button max = ButtonBuilder.create().text("Max").onAction(new EventHandler<ActionEvent>(){
            @Override public void handle(ActionEvent e){
                javafx.geometry.Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
                stage.setX(primaryScreenBounds.getMinX());
                stage.setY(primaryScreenBounds.getMinY());
                stage.setWidth(primaryScreenBounds.getWidth());
                stage.setHeight(primaryScreenBounds.getHeight());
            }
        }).build();
	VBox vbox = new VBox(8);
	vbox.getChildren().addAll(close, hidden, max, full);
    Group root = new Group(vbox);
    Scene scene = SceneBuilder.create().root(root).width(400).height(300).build();
    stage.setScene(scene);
    stage.show();
  }
}
Builder的效率有问题,而且还有很多隐患,参看Oracle给出的文档解释,api 8中已经删除了控件Builder
第三方89 2014-01-03
  • 打赏
  • 举报
回复
huntor 2014-01-03
  • 打赏
  • 举报
回复
import javafx.application.Application;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.event.*;

public class CloseFXWindow extends Application {
  public static void main(final String... args) {
    Application.launch(CloseFXWindow.class, args);
  }

  @Override public void start(final Stage stage) {
    stage.setTitle("FX Close");
    Button close = ButtonBuilder.create().text("Close").onAction(new EventHandler<ActionEvent>(){
        @Override public void handle(ActionEvent e){
          Event.fireEvent(stage, new WindowEvent(stage, WindowEvent.WINDOW_CLOSE_REQUEST ));
        }
      }).build();
    Button hidden = ButtonBuilder.create().text("Hidden").onAction(new EventHandler<ActionEvent>(){
            @Override public void handle(ActionEvent e){
                stage.setIconified(true);
            }
        }).build();
	Button full = ButtonBuilder.create().text("Full Screen").onAction(new EventHandler<ActionEvent>(){
			@Override public void handle(ActionEvent e){
				stage.setFullScreen(true);
			}
		}).build();
    Button max = ButtonBuilder.create().text("Max").onAction(new EventHandler<ActionEvent>(){
            @Override public void handle(ActionEvent e){
                javafx.geometry.Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
                stage.setX(primaryScreenBounds.getMinX());
                stage.setY(primaryScreenBounds.getMinY());
                stage.setWidth(primaryScreenBounds.getWidth());
                stage.setHeight(primaryScreenBounds.getHeight());
            }
        }).build();
	VBox vbox = new VBox(8);
	vbox.getChildren().addAll(close, hidden, max, full);
    Group root = new Group(vbox);
    Scene scene = SceneBuilder.create().root(root).width(400).height(300).build();
    stage.setScene(scene);
    stage.show();
  }
}
第三方89 2014-01-03
  • 打赏
  • 举报
回复
引用 9 楼 Gaowen_HAN 的回复:
[quote=引用 8 楼 u013093402 的回复:] [quote=引用 7 楼 Gaowen_HAN 的回复:] [quote=引用 6 楼 u013093402 的回复:] [quote=引用 4 楼 Gaowen_HAN 的回复:] [quote=引用 楼主 u013093402 的回复:] javaFX中的Stage窗口怎么使用程序而不是用户操作界面最大化/最小化? stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!
不过你说的“stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!”是语法上行不通的,你要派发事件,那么首先要生成你想要的事件,例如:
changeButton.dispatchEvent(new MouseEvent(component, e.getID(), e
					.getWhen(), e.getModifiers(), componentPoint.x,
					componentPoint.y, e.getClickCount(), e.isPopupTrigger()));
一个最直接办法是利用Robot仿真模拟动作。[/quote] fireEvent方法不行吗?[/quote]行啊,但是你要fire哪个e呢,得new 一个event[/quote] 那个还原窗口大小的按钮是什么名字?从哪里得到?[/quote]就是createMaximumButton()和createMinmumButton()[/quote]Stage hide()后,事件就阻塞了。能不能设置Stage让它不这样?
fearlessMore 2014-01-03
  • 打赏
  • 举报
回复
引用 8 楼 u013093402 的回复:
[quote=引用 7 楼 Gaowen_HAN 的回复:] [quote=引用 6 楼 u013093402 的回复:] [quote=引用 4 楼 Gaowen_HAN 的回复:] [quote=引用 楼主 u013093402 的回复:] javaFX中的Stage窗口怎么使用程序而不是用户操作界面最大化/最小化? stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!
不过你说的“stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!”是语法上行不通的,你要派发事件,那么首先要生成你想要的事件,例如:
changeButton.dispatchEvent(new MouseEvent(component, e.getID(), e
					.getWhen(), e.getModifiers(), componentPoint.x,
					componentPoint.y, e.getClickCount(), e.isPopupTrigger()));
一个最直接办法是利用Robot仿真模拟动作。[/quote] fireEvent方法不行吗?[/quote]行啊,但是你要fire哪个e呢,得new 一个event[/quote] 那个还原窗口大小的按钮是什么名字?从哪里得到?[/quote]就是createMaximumButton()和createMinmumButton()
第三方89 2014-01-03
  • 打赏
  • 举报
回复
引用 7 楼 Gaowen_HAN 的回复:
[quote=引用 6 楼 u013093402 的回复:] [quote=引用 4 楼 Gaowen_HAN 的回复:] [quote=引用 楼主 u013093402 的回复:] javaFX中的Stage窗口怎么使用程序而不是用户操作界面最大化/最小化? stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!
不过你说的“stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!”是语法上行不通的,你要派发事件,那么首先要生成你想要的事件,例如:
changeButton.dispatchEvent(new MouseEvent(component, e.getID(), e
					.getWhen(), e.getModifiers(), componentPoint.x,
					componentPoint.y, e.getClickCount(), e.isPopupTrigger()));
一个最直接办法是利用Robot仿真模拟动作。[/quote] fireEvent方法不行吗?[/quote]行啊,但是你要fire哪个e呢,得new 一个event[/quote] 那个还原窗口大小的按钮是什么名字?从哪里得到?
fearlessMore 2014-01-03
  • 打赏
  • 举报
回复
引用 6 楼 u013093402 的回复:
[quote=引用 4 楼 Gaowen_HAN 的回复:] [quote=引用 楼主 u013093402 的回复:] javaFX中的Stage窗口怎么使用程序而不是用户操作界面最大化/最小化? stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!
不过你说的“stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!”是语法上行不通的,你要派发事件,那么首先要生成你想要的事件,例如:
changeButton.dispatchEvent(new MouseEvent(component, e.getID(), e
					.getWhen(), e.getModifiers(), componentPoint.x,
					componentPoint.y, e.getClickCount(), e.isPopupTrigger()));
一个最直接办法是利用Robot仿真模拟动作。[/quote] fireEvent方法不行吗?[/quote]行啊,但是你要fire哪个e呢,得new 一个event
第三方89 2014-01-03
  • 打赏
  • 举报
回复
引用 4 楼 Gaowen_HAN 的回复:
[quote=引用 楼主 u013093402 的回复:] javaFX中的Stage窗口怎么使用程序而不是用户操作界面最大化/最小化? stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!
不过你说的“stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!”是语法上行不通的,你要派发事件,那么首先要生成你想要的事件,例如:
changeButton.dispatchEvent(new MouseEvent(component, e.getID(), e
					.getWhen(), e.getModifiers(), componentPoint.x,
					componentPoint.y, e.getClickCount(), e.isPopupTrigger()));
一个最直接办法是利用Robot仿真模拟动作。[/quote] fireEvent方法不行吗?
第三方89 2014-01-03
  • 打赏
  • 举报
回复
引用 3 楼 Gaowen_HAN 的回复:
不过还是给你做了个。。
/**
	 * Define a "Close" button, which is indispensable for an undecorated stage
	 * 
	 * @return a "Close" button
	 */
	private Node createCloseButton() {
		closeButton = new Button("Close");
		closeButton.setId("button-close");
		closeButton.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				Platform.exit();
			}
		});

		return closeButton;
	}

	/**
	 * Define a "Maximize" button
	 * 
	 * @return a "Maximize" button
	 */
	private Node createMaximizeButton() {
		Button maximizeButton = new Button("Maximize");
		maximizeButton.setId("button-maximize");

		maximizeButton.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				/* Toggle the maximizing action */
				toggleMaximized(applicationStage);
			}
		});

		return maximizeButton;
	}

/**
	 * Toggle the maximized action.
	 * 
	 * @param primaryStage
	 *            - the primary stage
	 */
	private void toggleMaximized(Stage primaryStage) {
		ObservableList<Screen> screens = Screen.getScreensForRectangle(primaryStage.getX(), primaryStage.getY(), 1, 1);
		if (screens.isEmpty()) {
			screen = Screen.getScreensForRectangle(0, 0, 1, 1).get(0);
		} else {
			screen = screens.get(0);
		}

		if (maximized.get()) {
			maximized.set(false);
			if (backupWindowBounds != null) {
				minimizeButton.setStyle("-fx-background-insets: 0 0 -1 0, 0, 1, 2; " + "-fx-background-color: -fx-shadow-highlight-color, "
						+ "-fx-outer-border, -fx-inner-border, -fx-body-color;");
				closeButton.setStyle("-fx-background-insets: 0 0 -1 0, 0, 1, 2;" + "-fx-background-color: -fx-shadow-highlight-color, "
						+ "-fx-outer-border, -fx-inner-border, -fx-body-color;");
				primaryStage.setX(backupWindowBounds.get().getMinX());
				primaryStage.setY(backupWindowBounds.get().getMinY());
				primaryStage.setWidth(backupWindowBounds.get().getWidth());
				primaryStage.setHeight(backupWindowBounds.get().getHeight());
			}
		} else {
			maximized.set(true);
			minimizeButton.setStyle("-fx-background-insets: -1.4, 0, 1, 2; " + "-fx-background-color: transparent, -fx-outer-border, "
					+ "-fx-inner-border, -fx-body-color;");
			closeButton.setStyle("-fx-background-insets: -1.4, 0, 1, 2; " + "-fx-background-color: transparent, -fx-outer-border, "
					+ "-fx-inner-border, -fx-body-color;");
			backupWindowBounds.set(new Rectangle2D(primaryStage.getX(), primaryStage.getY(), primaryStage.getWidth(), primaryStage.getHeight()));
			primaryStage.setX(screen.getVisualBounds().getMinX() - 20);
			primaryStage.setY(screen.getVisualBounds().getMinY() - 10);
			primaryStage.setWidth(screen.getVisualBounds().getWidth() + 40);
			primaryStage.setHeight(screen.getVisualBounds().getHeight() + 30);
		}
	}

/**
	 * Define a "Minimize" button
	 * 
	 * @return a "Minimize" button
	 */
	private Node createMinimizeButton() {
		minimizeButton = new Button("Minimize");
		minimizeButton.setId("button-minimize");
		minimizeButton.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				applicationStage.setIconified(true);
			}
		});

		return minimizeButton;
	}

	/**
	 * Enable the root node to be dragged. Realize some drag functions.
	 * 
	 * @param root
	 *            - the root node
	 */
	private void enableDragging(final AnchorPane root) {
		/*
		 * This mouse event is for resizing window. Define some specific cursor patterns.
		 */
		root.setOnMouseMoved(new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent me) {
				if (me.getX() > root.getWidth() - 10 && me.getX() < root.getWidth() + 10 && me.getY() > root.getHeight() - 10
						&& me.getY() < root.getHeight() + 10) {
					root.setCursor(Cursor.SE_RESIZE);
				} else if (me.getX() > root.getWidth() - 5 && me.getX() < root.getWidth() + 5) {
					root.setCursor(Cursor.H_RESIZE);
				} else if (me.getY() > root.getHeight() - 5 && me.getY() < root.getHeight() + 5) {
					root.setCursor(Cursor.V_RESIZE);
				} else {
					root.setCursor(Cursor.DEFAULT);
				}
			}
		});

		/* when mouse button is pressed, save the initial position of screen. */
		root.setOnMousePressed(new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent me) {
				Window primaryStage = root.getScene().getWindow();
				anchor.set(new Point2D(me.getScreenX() - primaryStage.getX(), me.getScreenY() - primaryStage.getY()));
				widthStage.set(primaryStage.getWidth());
				heightStage.set(primaryStage.getHeight());
			}
		});

		/*
		 * when mouse button is released, clear the initial position of screen. This action is very important, because it can be a judge to avoid
		 * mouse interaction with other nodes as ChoiceBox.
		 */
		root.setOnMouseReleased(new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent me) {
				anchor.set(null);
			}
		});

		/*
		 * when screen is dragged, translate it accordingly. Note that the transparent pixels part contained in the root will not react to the drag.
		 * But translucent color is able to.
		 */
		root.setOnMouseDragged(new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent me) {
				if (anchor.get() != null) {
					/* The drag event on the root really takes place. */
					drag(me, root);
				}
			}
		});
	}

	/**
	 * Drag the primary stage.
	 * 
	 * @param me
	 *            - the mouse event
	 * @param root
	 *            - the root node of stage
	 */
	private void drag(MouseEvent me, Node root) {
		Window primaryStage = root.getScene().getWindow();
		if (root.getCursor() == Cursor.H_RESIZE) {
			setWidth(me, primaryStage);
		} else if (root.getCursor() == Cursor.V_RESIZE) {
			setHeight(me, primaryStage);
		} else if (root.getCursor() == Cursor.SE_RESIZE) {
			setWidth(me, primaryStage);
			setHeight(me, primaryStage);
		} else {
			/* moving the stage */
			moveStage(me, primaryStage);
		}
	}

	/**
	 * Set the stage width.
	 * 
	 * @param me
	 *            - the mouse event
	 * @param primaryStage
	 *            - the primary stage
	 */
	private void setWidth(MouseEvent me, Window primaryStage) {
		double stageMinWidth = 600;
		primaryStage.setWidth(Math.max(stageMinWidth, widthStage.get() + (me.getScreenX() - (anchor.get().getX() + primaryStage.getX()))));
	}

	/**
	 * Set the stage height.
	 * 
	 * @param me
	 *            - the mouse event
	 * @param primaryStage
	 *            - the primary stage
	 */
	private void setHeight(MouseEvent me, Window primaryStage) {
		double stageMinHeight = 400;
		primaryStage.setHeight(Math.max(stageMinHeight, heightStage.get() + (me.getScreenY() - (anchor.get().getY() + primaryStage.getY()))));
	}

	/**
	 * Move the stage.
	 * 
	 * @param me
	 *            - the mouse event
	 * @param primaryStage
	 *            - the primary stage
	 */
	private void moveStage(MouseEvent me, Window primaryStage) {
		if (maximized.get()) {
			anchor.set(new Point2D(((me.getScreenX() - primaryStage.getX()) / primaryStage.getWidth()) * backupWindowBounds.get().getWidth(), me
					.getScreenY() - screen.getVisualBounds().getMinY()));
			primaryStage.setWidth(backupWindowBounds.get().getWidth());
			primaryStage.setHeight(backupWindowBounds.get().getHeight());
			maximized.set(false);
		}
		primaryStage.setX(me.getScreenX() - anchor.get().getX());
		primaryStage.setY(me.getScreenY() - anchor.get().getY());
	}
怎么还需要屏幕尺寸呢
fearlessMore 2014-01-03
  • 打赏
  • 举报
回复
引用 楼主 u013093402 的回复:
javaFX中的Stage窗口怎么使用程序而不是用户操作界面最大化/最小化? stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!
不过你说的“stage.getEventDispatcher().dispatchEvent();事件类型没找到最大化/最小化的事件!”是语法上行不通的,你要派发事件,那么首先要生成你想要的事件,例如:
changeButton.dispatchEvent(new MouseEvent(component, e.getID(), e
					.getWhen(), e.getModifiers(), componentPoint.x,
					componentPoint.y, e.getClickCount(), e.isPopupTrigger()));
一个最直接办法是利用Robot仿真模拟动作。
fearlessMore 2014-01-03
  • 打赏
  • 举报
回复
不过还是给你做了个。。
/**
	 * Define a "Close" button, which is indispensable for an undecorated stage
	 * 
	 * @return a "Close" button
	 */
	private Node createCloseButton() {
		closeButton = new Button("Close");
		closeButton.setId("button-close");
		closeButton.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				Platform.exit();
			}
		});

		return closeButton;
	}

	/**
	 * Define a "Maximize" button
	 * 
	 * @return a "Maximize" button
	 */
	private Node createMaximizeButton() {
		Button maximizeButton = new Button("Maximize");
		maximizeButton.setId("button-maximize");

		maximizeButton.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				/* Toggle the maximizing action */
				toggleMaximized(applicationStage);
			}
		});

		return maximizeButton;
	}

/**
	 * Toggle the maximized action.
	 * 
	 * @param primaryStage
	 *            - the primary stage
	 */
	private void toggleMaximized(Stage primaryStage) {
		ObservableList<Screen> screens = Screen.getScreensForRectangle(primaryStage.getX(), primaryStage.getY(), 1, 1);
		if (screens.isEmpty()) {
			screen = Screen.getScreensForRectangle(0, 0, 1, 1).get(0);
		} else {
			screen = screens.get(0);
		}

		if (maximized.get()) {
			maximized.set(false);
			if (backupWindowBounds != null) {
				minimizeButton.setStyle("-fx-background-insets: 0 0 -1 0, 0, 1, 2; " + "-fx-background-color: -fx-shadow-highlight-color, "
						+ "-fx-outer-border, -fx-inner-border, -fx-body-color;");
				closeButton.setStyle("-fx-background-insets: 0 0 -1 0, 0, 1, 2;" + "-fx-background-color: -fx-shadow-highlight-color, "
						+ "-fx-outer-border, -fx-inner-border, -fx-body-color;");
				primaryStage.setX(backupWindowBounds.get().getMinX());
				primaryStage.setY(backupWindowBounds.get().getMinY());
				primaryStage.setWidth(backupWindowBounds.get().getWidth());
				primaryStage.setHeight(backupWindowBounds.get().getHeight());
			}
		} else {
			maximized.set(true);
			minimizeButton.setStyle("-fx-background-insets: -1.4, 0, 1, 2; " + "-fx-background-color: transparent, -fx-outer-border, "
					+ "-fx-inner-border, -fx-body-color;");
			closeButton.setStyle("-fx-background-insets: -1.4, 0, 1, 2; " + "-fx-background-color: transparent, -fx-outer-border, "
					+ "-fx-inner-border, -fx-body-color;");
			backupWindowBounds.set(new Rectangle2D(primaryStage.getX(), primaryStage.getY(), primaryStage.getWidth(), primaryStage.getHeight()));
			primaryStage.setX(screen.getVisualBounds().getMinX() - 20);
			primaryStage.setY(screen.getVisualBounds().getMinY() - 10);
			primaryStage.setWidth(screen.getVisualBounds().getWidth() + 40);
			primaryStage.setHeight(screen.getVisualBounds().getHeight() + 30);
		}
	}

/**
	 * Define a "Minimize" button
	 * 
	 * @return a "Minimize" button
	 */
	private Node createMinimizeButton() {
		minimizeButton = new Button("Minimize");
		minimizeButton.setId("button-minimize");
		minimizeButton.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				applicationStage.setIconified(true);
			}
		});

		return minimizeButton;
	}

	/**
	 * Enable the root node to be dragged. Realize some drag functions.
	 * 
	 * @param root
	 *            - the root node
	 */
	private void enableDragging(final AnchorPane root) {
		/*
		 * This mouse event is for resizing window. Define some specific cursor patterns.
		 */
		root.setOnMouseMoved(new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent me) {
				if (me.getX() > root.getWidth() - 10 && me.getX() < root.getWidth() + 10 && me.getY() > root.getHeight() - 10
						&& me.getY() < root.getHeight() + 10) {
					root.setCursor(Cursor.SE_RESIZE);
				} else if (me.getX() > root.getWidth() - 5 && me.getX() < root.getWidth() + 5) {
					root.setCursor(Cursor.H_RESIZE);
				} else if (me.getY() > root.getHeight() - 5 && me.getY() < root.getHeight() + 5) {
					root.setCursor(Cursor.V_RESIZE);
				} else {
					root.setCursor(Cursor.DEFAULT);
				}
			}
		});

		/* when mouse button is pressed, save the initial position of screen. */
		root.setOnMousePressed(new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent me) {
				Window primaryStage = root.getScene().getWindow();
				anchor.set(new Point2D(me.getScreenX() - primaryStage.getX(), me.getScreenY() - primaryStage.getY()));
				widthStage.set(primaryStage.getWidth());
				heightStage.set(primaryStage.getHeight());
			}
		});

		/*
		 * when mouse button is released, clear the initial position of screen. This action is very important, because it can be a judge to avoid
		 * mouse interaction with other nodes as ChoiceBox.
		 */
		root.setOnMouseReleased(new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent me) {
				anchor.set(null);
			}
		});

		/*
		 * when screen is dragged, translate it accordingly. Note that the transparent pixels part contained in the root will not react to the drag.
		 * But translucent color is able to.
		 */
		root.setOnMouseDragged(new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent me) {
				if (anchor.get() != null) {
					/* The drag event on the root really takes place. */
					drag(me, root);
				}
			}
		});
	}

	/**
	 * Drag the primary stage.
	 * 
	 * @param me
	 *            - the mouse event
	 * @param root
	 *            - the root node of stage
	 */
	private void drag(MouseEvent me, Node root) {
		Window primaryStage = root.getScene().getWindow();
		if (root.getCursor() == Cursor.H_RESIZE) {
			setWidth(me, primaryStage);
		} else if (root.getCursor() == Cursor.V_RESIZE) {
			setHeight(me, primaryStage);
		} else if (root.getCursor() == Cursor.SE_RESIZE) {
			setWidth(me, primaryStage);
			setHeight(me, primaryStage);
		} else {
			/* moving the stage */
			moveStage(me, primaryStage);
		}
	}

	/**
	 * Set the stage width.
	 * 
	 * @param me
	 *            - the mouse event
	 * @param primaryStage
	 *            - the primary stage
	 */
	private void setWidth(MouseEvent me, Window primaryStage) {
		double stageMinWidth = 600;
		primaryStage.setWidth(Math.max(stageMinWidth, widthStage.get() + (me.getScreenX() - (anchor.get().getX() + primaryStage.getX()))));
	}

	/**
	 * Set the stage height.
	 * 
	 * @param me
	 *            - the mouse event
	 * @param primaryStage
	 *            - the primary stage
	 */
	private void setHeight(MouseEvent me, Window primaryStage) {
		double stageMinHeight = 400;
		primaryStage.setHeight(Math.max(stageMinHeight, heightStage.get() + (me.getScreenY() - (anchor.get().getY() + primaryStage.getY()))));
	}

	/**
	 * Move the stage.
	 * 
	 * @param me
	 *            - the mouse event
	 * @param primaryStage
	 *            - the primary stage
	 */
	private void moveStage(MouseEvent me, Window primaryStage) {
		if (maximized.get()) {
			anchor.set(new Point2D(((me.getScreenX() - primaryStage.getX()) / primaryStage.getWidth()) * backupWindowBounds.get().getWidth(), me
					.getScreenY() - screen.getVisualBounds().getMinY()));
			primaryStage.setWidth(backupWindowBounds.get().getWidth());
			primaryStage.setHeight(backupWindowBounds.get().getHeight());
			maximized.set(false);
		}
		primaryStage.setX(me.getScreenX() - anchor.get().getX());
		primaryStage.setY(me.getScreenY() - anchor.get().getY());
	}
fearlessMore 2014-01-03
  • 打赏
  • 举报
回复
引用 1 楼 u013093402 的回复:
你看Swing中怎么操作再说吧

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧