在JavaFX中拖动未装饰的阶段
我想有一个舞台设置为“未装饰”,使拖拉和最小化。问题是我找不到这样做的方法,因为我遇到的例子都是通过插入到主方法中的方法来实现的 我希望通过在控制器类中声明的方法来实现这一点,就像我如何处理下面的“WindowClose()”方法一样 这是我使用JavaFX的第二天,如果这似乎是一个太多的常识问题的话。提前谢谢大家在JavaFX中拖动未装饰的阶段,java,javafx,Java,Javafx,我想有一个舞台设置为“未装饰”,使拖拉和最小化。问题是我找不到这样做的方法,因为我遇到的例子都是通过插入到主方法中的方法来实现的 我希望通过在控制器类中声明的方法来实现这一点,就像我如何处理下面的“WindowClose()”方法一样 这是我使用JavaFX的第二天,如果这似乎是一个太多的常识问题的话。提前谢谢大家 // Main Class/ Method import javafx.application.Application; import javafx.fxml.FXMLLoader
// Main Class/ Method
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class Fxmltableview extends Application {
public static String pageSource = "fxml_tableview.fxml";
public static Scene scene;
@Override
public void start(Stage stage) throws Exception {
stage.initStyle(StageStyle.UNDECORATED);
stage.initStyle(StageStyle.TRANSPARENT);
Parent root = FXMLLoader.load(getClass().getResource(pageSource));
scene = new Scene(root, Color.TRANSPARENT);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
//控制器
导入javafx.application.Platform;
导入javafx.collections.ObservableList;
导入javafx.event.ActionEvent;
导入javafx.fxml.fxml;
导入javafx.scene.control.TableView;
导入javafx.scene.control.TextField;
公共类FXMLTableViewController{
@FXML私有表视图表视图;
@FXML私有文本字段firstNameField;
@FXML私有文本字段lastNameField;
@FXML私有文本字段emailField;
@FXML
受保护的void addPerson(ActionEvent事件){
ObservableList data=tableView.getItems();
数据。添加(新人员)(
firstNameField.getText(),
lastNameField.getText(),
emailField.getText()
));
firstNameField.setText(“”);
lastNameField.setText(“”);
emailField.setText(“”);
}
公共作废窗口关闭(ActionEvent事件){
Platform.exit();
}
}
策略
您已经在开始方法中引用了该阶段
您需要的是能够将stage传递给控制器,以便控制器能够使stage可由给定节点拖动
stage.initStyle(StageStyle.UNDECORATED);
stage.initStyle(StageStyle.TRANSPARENT);
FXMLLoader loader = new FXMLLoader(
getClass().getResource(
"fxml_tableview.fxml"
)
);
stage.setScene(
new Scene(
(Parent) loader.load()
)
);
FXMLTableViewController controller =
loader.<FXMLTableViewController>getController();
controller.registerStage(stage);
stage.show();
EffectUtilities.makeDragable()
来自我前面链接的示例代码
更新fxml\u tableview.fxml
文件,以包含控制器中引用的所需新dragNode
替代实施
在控制器的initialize方法中,在dragNode的sceneProperty和更改的场景的window属性上添加更改侦听器,以获得舞台更改的通知,以便可以调用makeDraggable
示例代码EffectUtilities.makeDraggable(stage,byNode)
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.Cursor;
导入javafx.scene.Node;
导入javafx.scene.input.MouseEvent;
导入javafx.stage.stage;
导入javafx.util.Duration;
/**用于将不同效果应用于节点的各种实用程序*/
公用事业{
/**使用给定节点使舞台可拖动*/
公共静态void makeDraggable(最终阶段,最终节点逐节点){
最终增量dragDelta=新增量();
setOnMousePressed(新的EventHandler(){
@重写公共无效句柄(MouseEvent MouseEvent){
//记录拖放操作的增量距离。
dragDelta.x=stage.getX()-mouseEvent.getScreenX();
dragDelta.y=stage.getY()-mouseEvent.getScreenY();
设置光标(Cursor.MOVE);
}
});
setOnMouseReleased(新的EventHandler(){
@重写公共无效句柄(MouseEvent MouseEvent){
设置光标(Cursor.HAND);
}
});
setOnMouseDrawed(新的EventHandler(){
@重写公共无效句柄(MouseEvent MouseEvent){
setX(mouseEvent.getScreenX()+dragDelta.x);
stage.setY(mouseEvent.getScreenY()+dragDelta.y);
}
});
SetOnMouseCentered(新的EventHandler(){
@重写公共无效句柄(MouseEvent MouseEvent){
如果(!mouseEvent.isPrimaryButtonDown()){
设置光标(Cursor.HAND);
}
}
});
setOnMouseExited(新的EventHandler(){
@重写公共无效句柄(MouseEvent MouseEvent){
如果(!mouseEvent.isPrimaryButtonDown()){
setCursor(Cursor.DEFAULT);
}
}
});
}
/**记录相对x和y坐标*/
私有静态类增量{
双x,y;
}
}
从FXML设置要用于拖动应用程序的控制器或组件的id
<Pane onMousePressed="#panePressed" onMouseDragged="#paneDragged"/>
您必须有delta类,它将存储delta x和y的值
公共类增量{
公共双x,y;
}
要获得阶段,只需创建mutator和accessor,有关铸造的更多信息,只需转到可能的副本,我不知道从哪里获得这些
效应实用程序
?!附加了一份EffectUtilities示例代码的副本(也是)。
@FXML private Rectangle dragNode;
public void registerStage(Stage stage) {
EffectUtilities.makeDraggable(stage, dragNode)
}
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;
import javafx.util.Duration;
/** Various utilities for applying different effects to nodes. */
public class EffectUtilities {
/** makes a stage draggable using a given node */
public static void makeDraggable(final Stage stage, final Node byNode) {
final Delta dragDelta = new Delta();
byNode.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
// record a delta distance for the drag and drop operation.
dragDelta.x = stage.getX() - mouseEvent.getScreenX();
dragDelta.y = stage.getY() - mouseEvent.getScreenY();
byNode.setCursor(Cursor.MOVE);
}
});
byNode.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
byNode.setCursor(Cursor.HAND);
}
});
byNode.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
stage.setX(mouseEvent.getScreenX() + dragDelta.x);
stage.setY(mouseEvent.getScreenY() + dragDelta.y);
}
});
byNode.setOnMouseEntered(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
if (!mouseEvent.isPrimaryButtonDown()) {
byNode.setCursor(Cursor.HAND);
}
}
});
byNode.setOnMouseExited(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
if (!mouseEvent.isPrimaryButtonDown()) {
byNode.setCursor(Cursor.DEFAULT);
}
}
});
}
/** records relative x and y co-ordinates. */
private static class Delta {
double x, y;
}
}
<Pane onMousePressed="#panePressed" onMouseDragged="#paneDragged"/>