2013-09-13 3 views
3

Я хотел бы, чтобы на сцене был установлен параметр «UNDECORATED», который можно было перетаскивать и минимизировать. Проблема в том, что я не могу найти способ сделать это, так как примеры, которые я прихожу, делают это, используя методы, встроенные в основной метод.Перетаскивание незадекларированной ступени в JavaFX

Я хотел бы, чтобы это было сделано с помощью метода, объявленного в классе контроллера, например, как мне удалось сделать метод «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); 
    } 
} 

..

// The Controller 

import javafx.application.Platform; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.scene.control.TableView; 
import javafx.scene.control.TextField; 

public class FXMLTableViewController { 
    @FXML private TableView<Person> tableView; 
    @FXML private TextField firstNameField; 
    @FXML private TextField lastNameField; 
    @FXML private TextField emailField; 

    @FXML 
    protected void addPerson (ActionEvent event) { 
     ObservableList<Person> data = tableView.getItems(); 
     data.add(new Person(
       firstNameField.getText(), 
       lastNameField.getText(), 
       emailField.getText() 
       )); 

     firstNameField.setText(""); 
     lastNameField.setText(""); 
     emailField.setText(""); 
    } 

    public void WindowClose (ActionEvent event) { 
      Platform.exit(); 
    } 
} 
+0

возможно дубликат [Как перетащить этап accross экран в JavaFX] (http://stackoverflow.com/questions/18809324/how-to-drag-a -stage-accross-the-screen-in-javafx) – jewelsea

ответ

4

Стратегия

У вас уже есть ссылка на стадии в вашем методе запуска.

Что нужно, чтобы передать сцену контроллеру, чтобы контроллер мог перетаскивать сцену на заданный узел.

  1. «Передача параметров непосредственно от вызывающего абонента к контроллеру» метод может быть использован для передачи ссылки на сцену в контроллер: Passing Parameters JavaFX FXML.

  2. Используйте makeDraggable method from this sample code, чтобы позволить кадру перетаскивать данный узел.

Пример реализации

Некоторые псевдо-код для метода запуска приложения следующим образом:

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(); 

И для нового метода registerStage Контролера:

@FXML private Rectangle dragNode; 

public void registerStage(Stage stage) { 
    EffectUtilities.makeDraggable(stage, dragNode) 
} 

EffectUtilities.makeDraggable() приходит от сампа le code, который я связал ранее.

Обновите файл fxml_tableview.fxml, чтобы добавить требуемый новый dragNode, указанный в контроллере.

Alternate реализация

В методе инициализации контроллера, добавить изменения слушателя sceneProperty в dragNode и свойство окна изменённых сцен, чтобы получить уведомление о смене сцены, так что вы можете вызвать makeDraggable.

Пример кода EffectUtilities.makeDraggable(stage, byNode)

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; 
    } 
} 
+0

Я не знаю, где взять эти 'EffectUtilities' ?! – Kalaschni

+0

Прикреплена копия примера примера EffectUtilities (она также [связана в ответе] (https://gist.github.com/jewelsea/3388637)). – jewelsea

Смежные вопросы