java - 跟踪节点 Obervable Nodes JavaFX
问题描述
在舞台上,我有两个窗格,当我单击一个窗格时,会创建一个新节点并将其添加到 ObservableList 中。我想在一个窗格节点上创建相同的,反之亦然。我在列表集的列表列表中,当它检测到列表中的更改时,它应该将此节点添加到所有窗格中。
当我单击第二个面板时,它们会加起来但仅在第一个面板上,它们不会出现在第二个面板上。我也有节点移位的问题,我希望能够仅在其窗格内移动节点,因此它不能超出其窗格。
我不知道该怎么做,我现在所做的对我不起作用
public class MainTest extends Application {
private ObservableList<Circle> observableList= FXCollections.observableArrayList();
private Pane pane;
private Pane pane2;
private HBox root;
private double orgSceneX, orgSceneY;
private double orgTranslateX, orgTranslateY;
@Override
public void start(Stage stage) throws Exception {
root = new HBox();
root.setPadding(new Insets(3));
root.setBorder(new Border(new BorderStroke(Color.BLACK,
BorderStrokeStyle.SOLID, new CornerRadii(1), new BorderWidths(2))));
root.setBackground(new Background(new BackgroundFill(
Color.DARKSLATEGRAY, CornerRadii.EMPTY, Insets.EMPTY)));
pane=createPane();
root.getChildren().add(pane);
setClick(pane);
pane2 = createPane();
root.getChildren().add(pane2);
setClick(pane2);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
observableList.addListener((ListChangeListener<Node>) change -> {
while(change.next()){
if(change.wasAdded()){
// pane2.getChildren().clear();
//pane.getChildren().clear();
pane2.getChildren().addAll(observableList);
System.out.println(pane2.getChildren().size());
pane.getChildren().addAll(observableList);
System.out.println(pane.getChildren().size());
}
}
});
}
private Pane createPane() {
Pane pane = new Pane();
pane.setPrefWidth(500);
pane.setPrefHeight(350);
pane.setBorder(new Border(new BorderStroke(Color.DARKGRAY,
BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(1))));
return pane;
}
void setClick(Pane pane) {
pane.setOnMouseClicked(e -> {
double drawX = e.getX();
double drawY = e.getY();
if(e.getButton() == MouseButton.PRIMARY) {
Circle circle = makeCircle(drawX, drawY);
observableList.add(circle);
// pane.getChildren().add(circle);
circle.setOnMouseClicked(event -> {
if(event.getButton() == MouseButton.SECONDARY) {
observableList.remove(circle);
deleteCircle(circle, pane);
event.consume();
}
});
}
});
}
private Circle makeCircle(double drawX, double drawY) {
Circle circle = new Circle(drawX, drawY, 5, Color.RED);
circle.setStroke(Color.BLACK);
EventHandler<MouseEvent> mouseHandler3 = k -> {
circle.setCursor(Cursor.OPEN_HAND);
k.consume();
};
circle.setOnMousePressed(circleOnMousePressedEventHandler);
circle.setOnMouseDragged(circleOnMouseDraggedEventHandler);
circle.setCursor(Cursor.OPEN_HAND);
System.out.println(circle.getCenterX() + " " + circle.getCenterY());
return circle;
}
EventHandler<MouseEvent> circleOnMousePressedEventHandler =
new EventHandler<>() {
@Override
public void handle(MouseEvent t) {
orgSceneX = t.getSceneX();
orgSceneY = t.getSceneY();
orgTranslateX = ((Circle) (t.getSource())).getTranslateX();
orgTranslateY = ((Circle) (t.getSource())).getTranslateY();
}
};
EventHandler<MouseEvent> circleOnMouseDraggedEventHandler =
new EventHandler<>() {
@Override
public void handle(MouseEvent t) {
double offsetX = t.getSceneX() - orgSceneX;
double offsetY = t.getSceneY() - orgSceneY;
double newTranslateX = orgTranslateX + offsetX;
double newTranslateY = orgTranslateY + offsetY;
((Circle) (t.getSource())).setTranslateX(newTranslateX);
((Circle) (t.getSource())).setTranslateY(newTranslateY);
}
};
private void deleteCircle(Circle circle, Pane pane) {
pane.getChildren().remove(circle);
}
}
解决方案
推荐阅读
- reactjs - Formik + yup:如何验证一个位置模式,其中字段(国家、州、城市)不是强制性的,但如果一个被填写,每个都应该填写?
- scala - 引起:java.lang.ClassNotFoundException:org.apache.hadoop.hive.hbase.HiveHBaseTableInputFormat
- php - 在 wordpress 中动态获取分类的所有类别名称
- vuejs2 - 如果输入变量为空,则阻止 vue-apollo 中的 graphql 查询
- python-3.x - 以读取的相同格式写入已解析的文件
- python - 多处理:如何 mp.map 将元素存储在列表中的函数?
- javascript - 如何将 user_id 传递给 Modal 弹出窗口并在 JSP 中显示相应的用户?
- php - 如何使用mysqli和php根据另一列连接和求和两个表中的列(仅使用查询)
- python - 如何提取嵌套在dict列表中的值列表?
- python - 如何在熊猫的给定两个日期之间查找是否需要工作日