Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaFX中拖动未装饰的阶段_Java_Javafx - Fatal编程技术网

在JavaFX中拖动未装饰的阶段

在JavaFX中拖动未装饰的阶段,java,javafx,Java,Javafx,我想有一个舞台设置为“未装饰”,使拖拉和最小化。问题是我找不到这样做的方法,因为我遇到的例子都是通过插入到主方法中的方法来实现的 我希望通过在控制器类中声明的方法来实现这一点,就像我如何处理下面的“WindowClose()”方法一样 这是我使用JavaFX的第二天,如果这似乎是一个太多的常识问题的话。提前谢谢大家 // Main Class/ Method import javafx.application.Application; import javafx.fxml.FXMLLoader

我想有一个舞台设置为“未装饰”,使拖拉和最小化。问题是我找不到这样做的方法,因为我遇到的例子都是通过插入到主方法中的方法来实现的

我希望通过在控制器类中声明的方法来实现这一点,就像我如何处理下面的“WindowClose()”方法一样

这是我使用JavaFX的第二天,如果这似乎是一个太多的常识问题的话。提前谢谢大家

// 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可由给定节点拖动

  • “将参数直接从调用方传递到控制器”方法可用于将阶段引用传递到控制器:

  • 使用允许由给定节点拖动阶段

  • 示例实现

    应用程序启动方法的一些psuedo代码如下所示:

    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"/>