【发布时间】:2016-11-13 02:05:46
【问题描述】:
我正在尝试使我创建的节点可拖动。
我可以将节点放置在窗格中我喜欢的位置,但是当涉及到拖动它们时,它们似乎会自动被关闭。
我尝试创建一个仅包含 x 和 y 的 Delta 类,在节点上按下鼠标时会相应更新。
nfaPane.setOnMousePressed(event -> {
if (!event.getButton().equals(MouseButton.PRIMARY)) return;
for (final NFANode node : nfaNodes)
if (node.isHover())
return;
final NFANode nfaNode = new NFANode(nfaNodes.size(), event.getX(), event.getY());
nfaPane.getChildren().add(nfaNode);
nfaNodes.add(nfaNode);
Delta dragDelta = new Delta();
nfaNode.setOnMousePressed(event1 -> {
dragDelta.setDragDeltaX(nfaNode.getLayoutX());
dragDelta.setDragDeltaY(nfaNode.getLayoutY());
});
nfaNode.setOnMouseDragged(event1 -> {
nfaNode.moveTo(event1.getSceneX() + dragDelta.getDragDeltaX(), event1.getSceneY() + dragDelta.getDragDeltaY());
});
});
节点本身由 NFANode 类定义:
package sample;
import javafx.scene.Group;
import javafx.scene.paint.Color;
import javafx.scene.shape.Ellipse;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
/**
* Created by David on 11/5/2016.
*/
public class NFANode extends Group {
//private List<NFANode> next;
public static final Font nfaFont = Font.font("Footlight MT Light", 25);
private final Ellipse bubble;
private final Text text;
private double textWidth;
public NFANode(int value, double x, double y) {
this.text = new Text(x, y + 5, "");
renumber(value);
this.text.setFont(nfaFont);
textWidth = this.text.getBoundsInLocal().getWidth();
bubble = new Ellipse(x, y, this.text.getBoundsInLocal().getWidth() + 5, 25);
this.text.setX(x - textWidth / 2);
bubble.setStroke(Color.BLACK);
bubble.setFill(Color.WHITE);
getChildren().addAll(bubble, this.text);
}
public Text getText() {
return text;
}
public void renumber(final int value) {
final StringBuilder builder = new StringBuilder();
for (char c : String.valueOf(value).toCharArray()) builder.append((char) (c + 8272));
text.setText("Q" + builder.toString());
}
public void moveTo(final double x, final double y) {
bubble.setCenterX(x);
bubble.setCenterY(y);
text.setX(x - textWidth / 2);
text.setY(y + 5);
}
}
我很困惑为什么这会在拖动时影响节点的位置?
【问题讨论】: