java在拖动未装饰的舞台时,如何强制光标停留在窗口上
我正在尝试创建一个带有未装饰阶段的gui计算器。我添加了一个Hbox作为标题栏,set给了它一个onClicked/OnDragged方法来在拖动时移动主阶段,但是它似乎并不完美。因为
1)当我按下并开始拖动时,鼠标光标移动到窗口的左上角,如下图所示。我使用的方法是从这里开始的
X图像:
When i click on middle of Hbox
Where the cursor moves when i start dragging
X这是我的主课
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
Scene mainSCENE = new Scene(root);
mainSCENE.getStylesheets().add(this.getClass().getResource("calculator.css").toExternalForm());
mainSCENE.setFill(Color.TRANSPARENT);
primaryStage.initStyle(StageStyle.TRANSPARENT);
primaryStage.setResizable(false);
primaryStage.setScene(mainSCENE);
mainWindow = primaryStage;
primaryStage.show();
}
X以下是我在控制器类中用于添加可拖动效果的方法
public class Controller {
@FXML
Circle btnCLOSE;
@FXML
Circle btnMINIMIZE;
@FXML
HBox hboxTitleBar;
private double xOffset = 0;
private double yOffset = 0;
public void handle(MouseEvent event) throws IOException, LineUnavailableException, UnsupportedAudioFileException {
// Plays click audio when buttons are clicked
AudioInputStream audioIn = AudioSystem.getAudioInputStream(getClass().getResource("click.wav"));
Clip clip = AudioSystem.getClip();
clip.open(audioIn);
clip.start();
// Add functionality to minimize/close buttons
btnCLOSE.addEventHandler(MouseEvent.MOUSE_CLICKED, event1 -> System.exit(0));
btnMINIMIZE.addEventHandler(MouseEvent.MOUSE_CLICKED, event1 -> Main.mainWindow.setIconified(true));
}
// Makes the UNDECORATED window draggable from the title bar Hbox
public void setOnClicked(MouseEvent event) {
System.out.println("CLICKED");
xOffset = Main.mainWindow.getX() - event.getScreenX();
yOffset = Main.mainWindow.getY() - event.getScreenY();
}
public void setOnDragged(MouseEvent event) {
Main.mainWindow.setX(event.getScreenX() + xOffset);
Main.mainWindow.setY(event.getScreenY() + yOffset);
}
}
拖动时如何将光标锁定到位
2)当我单击HBox内的关闭/最小化按钮时,它也会拖动窗口。有没有办法防止这种情况发生
# 1 楼答案
为了方便整个窗口的移动,您需要两个事件(按下/拖动),当您按下栏时,操作开始,通过初始化(
xOffset, yOffset
)的位置,我想如果我没有弄错的话您犯的错误是您使用了屏幕而不是场景。这里是第一个问题的解决方案:对于第二个问题,您可以在布局外添加关闭按钮,这对我来说是最简单的解决方案