【发布时间】:2013-12-01 12:57:55
【问题描述】:
我是 JavaFX 动画的新手。我正在尝试以下代码作为另一个大项目的试验; 基本上我想用鼠标拖动来移动圆圈, 当圆圈超过矩形时,突出显示矩形。 如果将圆形放到矩形上,将其颜色更改为圆形的颜色。
到目前为止,我已经设法用鼠标移动圆圈,但我不确定为什么矩形的 OnDragEntered 方法什么都不做。
这是 FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.shape.*?>
<?import javafx.scene.text.*?>
<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.sc.colordx.controller.D15Controller">
<children>
<Rectangle fx:id="r1" arcHeight="5.0" arcWidth="5.0" fill="WHITE" height="152.0" layoutX="33.0" layoutY="14.0" onDragDropped="#fillBox" onDragEntered="#highlightBox" pickOnBounds="true" stroke="BLACK" strokeType="INSIDE" width="52.5" />
<Rectangle fx:id="r2" arcHeight="5.0" arcWidth="5.0" fill="WHITE" height="152.0" layoutX="91.0" layoutY="14.0" onDragDropped="#fillBox" onDragEntered="#highlightBox" stroke="BLACK" strokeType="INSIDE" width="52.5" />
<Circle fx:id="c1" fill="DODGERBLUE" layoutX="348.0" layoutY="262.0" onDragDetected="#startDrag" onMouseDragged="#moveCircle" onMouseReleased="#removeBind" radius="54.5" stroke="BLACK" strokeType="INSIDE" />
<Circle id="c1" fx:id="c2" fill="#ff3d00" layoutX="217.0" layoutY="262.0" onDragDetected="#startDrag" onMouseDragged="#moveCircle" onMouseReleased="#removeBind" radius="54.5" stroke="BLACK" strokeType="INSIDE" />
</children>
</AnchorPane>
这是控制器:
包 com.sc.colordx.controller;
import java.awt.Point;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.animation.TranslateTransition;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.input.DragEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.util.Duration;
public class D15Controller implements Initializable {
@FXML
private Circle c1;
@FXML
private Rectangle r1;
// Animation Data
private static final Duration TRANSLATE_DURATION = Duration.seconds(0.25);
private TranslateTransition transition;
@FXML
private Circle c2;
@FXML
private Rectangle r2;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb)
{
// TODO
transition = createTranslateTransition(c1);
}
private TranslateTransition createTranslateTransition(final Circle circle) {
final TranslateTransition transition = new TranslateTransition(TRANSLATE_DURATION, circle);
return transition;
}
@FXML
private void removeBind(MouseEvent event)
{
if(event.getSource() instanceof Circle)
{
Circle circle = (Circle)event.getSource();
circle.setOpacity(1);
}
}
private void fillBox(DragEvent event)
{
System.out.println("Drag detected");
if(event.getGestureTarget() instanceof Rectangle)
{
Rectangle target=(Rectangle)event.getGestureTarget();
Circle source=(Circle)event.getGestureSource();
target.setFill(source.getFill());
}
}
@FXML
private void moveCircle(MouseEvent event)
{
Circle circle=null;
event.setDragDetect(true);
if(event.getSource() instanceof Circle)
{
circle=(Circle)event.getSource();
circle.setOpacity(0.25);
if (!event.isControlDown())
{
circle.setCenterX(event.getX());
circle.setCenterY(event.getY());
}
else
{
transition.setToX(circle.getCenterX());
transition.setToY(circle.getCenterY());
transition.playFromStart();
}
}
}
@FXML
private void startDrag(MouseEvent event)
{
if(event.getSource() instanceof Circle)
{
Circle source=(Circle)event.getSource();
source.startFullDrag();
}
}
@FXML
private void highlightBox(DragEvent event)
{
System.out.println("Highlight box");
if(event.getGestureSource() instanceof Circle)
{
Circle source=(Circle)event.getGestureSource();
Rectangle target=(Rectangle)event.getGestureTarget();
target.setFill(source.getFill());
}
}
}
这是正确的方法吗?还是我错误地将拖放与动画混合在一起? 对于那些想知道如何使用它的人来说,这是实施色盲测试的开始。
【问题讨论】:
标签: java animation drag-and-drop javafx-2 javafx