Javafx 2 如何在JavaFX中使未装饰的窗口可移动/拖动?
我必须创建一个应用程序,其中最小化和最大化按钮将被禁用 我使用了Javafx 2 如何在JavaFX中使未装饰的窗口可移动/拖动?,javafx-2,minimize,maximize,Javafx 2,Minimize,Maximize,我必须创建一个应用程序,其中最小化和最大化按钮将被禁用 我使用了“StageStyle.UNDECORATED”,应用程序将不再可移动或拖动,因此我正在寻找任何其他替代方案来制作我的应用程序 有人对此有解决办法吗 要使窗口不装饰但仍可移动/拖动,您必须在您选择的任何节点上处理相应的MouseEvent 示例: import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.S
“StageStyle.UNDECORATED”
,应用程序将不再可移动或拖动,因此我正在寻找任何其他替代方案来制作我的应用程序
有人对此有解决办法吗 要使窗口不装饰但仍可移动/拖动,您必须在您选择的任何节点上处理相应的
MouseEvent
示例:
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();
}
}
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.BorderPane;
导入javafx.stage.stage;
导入javafx.stage.StageStyle;
公共类SimpleWindowApplication扩展了应用程序{
专用双xOffset=0;
专用双yOffset=0;
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共作废开始(最终阶段初级阶段){
初级阶段。初始风格(阶段风格。未装饰);
BorderPane根=新的BorderPane();
setOnMousePressed(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
xOffset=event.getSceneX();
yOffset=event.getSceneY();
}
});
setOnMouseDrawed(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
setX(event.getScreenX()-xOffset);
setY(event.getScreenY()-yOffset);
}
});
场景=新场景(根,800600);
初级阶段。场景(场景);
primaryStage.show();
}
}
从Oracle的JavaFX下载页面中的非常有价值的示例中了解更多信息:此类的唯一目的是允许拖动未装饰的窗口。它还负责确保任务栏保持全屏可见,并确保未装饰的窗口不会被拖出屏幕。 最后,its为错误“未找到css资源”提供了错误修复 只需在阶段即将准备好显示时或之后,将下面的代码粘贴到重写的start()方法的主类中
WindowStyle.allowDrag(root, stage);
WindowStyle.stageDimension(stage.getWidth(), stage.getHeight());
注:当舞台即将准备好展示时或之后粘贴上述内容。
对于全屏窗口使用:
WindowStyle.fullScreen(Stage stage);
要将大小调整回以前的使用状态,请执行以下操作:
WindowStyle.restoreScreen(Stage stage);
要将自定义样式表添加到场景中,只需在定义场景后将下面的代码粘贴到重写的start()方法的主类中
scene.getStylesheets().add(WindowStyle.addStyleSheet(String css));
用于样式设置的css名称可以是:main.css
或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;
}
}
导入javafx.geometry.Rectangle2D;
导入javafx.scene.Parent;
导入javafx.scene.input.MouseEvent;
导入javafx.stage.Screen;
导入javafx.stage.stage;
/**
*@作者:BENJAH
*/
公共类窗口样式{
私有静态最终矩形2D SCREEN_BOUNDS=SCREEN.getPrimary()
.getVisualBounds();
专用静态双[]pref_WH,offset_XY;
私有静态字符串样式表;
私有窗口样式(字符串css){
样式表=getClass().getResource(css).toString();
}
受保护的静态无效allowDrag(父根,阶段){
root.setOnMousePressed((MouseEvent p)->{
offset_XY=新的双精度[]{p.getSceneX(),p.getSceneY()};
});
root.setonmousedrable((MouseEvent d)->{
//确保阶段不会拖过任务栏
如果(d.getScreenY(){
//确保舞台不会拖过屏幕顶部
if(stage.getY()上面的属性会同时隐藏标题栏吗?你打算如何拖动窗口?是的,NeilGhosh,上面的属性会隐藏整个标题栏。是的,这是解决我问题的最佳方法,对我真的很有帮助。非常感谢你的努力。就这样工作,非常感谢你的研究时间…我们已经使用了utiliz教育署署长:-D