当我在这个对象中时,JavaFx从pane对象中删除';s级

当我在这个对象中时,JavaFx从pane对象中删除';s级,java,javafx,Java,Javafx,我不知道是否有人能从标题中理解我的问题,但这里有更具体的描述。我有一个类,在其中我创建了一个流窗格,在其中我添加了另一个类的对象(打包在VBox中的图像)。每个VBox都有ContextMenu,其中是MenuItem“删除文件”。我的问题是,如何在VBox类中删除这个对象。下面是我代码的一小部分: //删除,编辑后的完整代码如下 我访问CustomPane(我的FlowPane类,具有指定属性)的代码是有效的,因为如果我通过对象的索引来删除对象,那么我可以删除对象,但当我删除其中一个对象时,其

我不知道是否有人能从标题中理解我的问题,但这里有更具体的描述。我有一个类,在其中我创建了一个流窗格,在其中我添加了另一个类的对象(打包在VBox中的图像)。每个VBox都有ContextMenu,其中是MenuItem“删除文件”。我的问题是,如何在VBox类中删除这个对象。下面是我代码的一小部分:

//删除,编辑后的完整代码如下

我访问CustomPane(我的FlowPane类,具有指定属性)的代码是有效的,因为如果我通过对象的索引来删除对象,那么我可以删除对象,但当我删除其中一个对象时,其他对象的索引会更改,所以我在寻找另一个解决方案。我需要在代码中删除类的对象

好的,这就是所谓的sscce,我都不知道,从现在起:

package sscce;

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;


public class Sscce extends Application {

@Override
public void start(Stage primaryStage) {
    CustomPane root = new CustomPane();
    root.setPadding(new Insets(20));
    root.setHgap(10);
    root.setVgap(10);
    for (int i = 0; i < 10; i++) {
        RectangleBox recB = new RectangleBox();
        root.getChildren().add(recB);
    }

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}


public static void main(String[] args) {
    launch(args);
}

}

class RectangleBox extends VBox {

static int index = 0;

public RectangleBox() {
    Rectangle rec = new Rectangle(150, 150);
    rec.setFill(Color.GREEN);

    StackPane sp = new StackPane();
    sp.getChildren().add(rec);
    Label label = new Label(Integer.toString(index));
    index++;
    sp.getChildren().add(label);
    getChildren().add(sp);
    final ContextMenu cm = new ContextMenu();
    MenuItem removeRec = new MenuItem("Remove Rectangle");
    removeRec.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent t) {

            ((CustomPane) getParent()).getPane().getChildren().remove(0); //here is the problem, I want this line to remove the rectangle I clicked on(now it's removing first element in the pane).

        }
    });

    cm.getItems().add(removeRec);
    createContextMenuEvent(cm, rec);

}

private void createContextMenuEvent(final ContextMenu cm, final Rectangle rec) {
    addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent t) {
            if (t.getButton() == MouseButton.SECONDARY) {
                cm.show(rec, t.getScreenX(), t.getScreenY());
            }
        }
    });
}

}

class CustomPane extends FlowPane {

public CustomPane() {
    //setAlignment(Pos.CENTER);
    setHgap(25);
    setVgap(25);
    setPadding(new Insets(20));
}

public CustomPane getPane() {
    return this;
}
}
封装sscce;
导入javafx.application.application;
导入静态javafx.application.application.launch;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.ContextMenu;
导入javafx.scene.control.Label;
导入javafx.scene.control.MenuItem;
导入javafx.scene.input.MouseButton;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.FlowPane;
导入javafx.scene.layout.StackPane;
导入javafx.scene.layout.VBox;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
公共类Sscce扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
CustomPane root=新建CustomPane();
根。设置填充(新插图(20));
根。setHgap(10);
根.setVgap(10);
对于(int i=0;i<10;i++){
RectangleBox recB=新矩形框();
root.getChildren().add(recB);
}
场景=新场景(根,300,250);
setTitle(“你好,世界!”);
初级阶段。场景(场景);
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
类矩形框扩展了VBox{
静态int指数=0;
公共矩形框(){
矩形rec=新矩形(150150);
记录设置填充(颜色为绿色);
StackPane sp=新的StackPane();
sp.getChildren().add(rec);
Label Label=新标签(Integer.toString(index));
索引++;
sp.getChildren().add(标签);
getChildren().add(sp);
最终上下文菜单cm=新上下文菜单();
MenuItem RemoveEC=新MenuItem(“删除矩形”);
setOnAction(新的EventHandler()){
@凌驾
公共无效句柄(ActionEvent t){
((CustomPane)getParent()).getPane().getChildren().remove(0);//问题在于,我希望此行删除我单击的矩形(现在它正在删除窗格中的第一个元素)。
}
});
cm.getItems().add(removeRec);
createContextMenuEvent(cm,rec);
}
私有void createContextMenuEvent(最终上下文菜单cm,最终矩形rec){
addEventHandler(鼠标点击MouseEvent.MOUSE_,新建EventHandler()){
@凌驾
公共无效句柄(MouseEvent t){
if(t.getButton()==MouseButton.SECONDARY){
cm.show(rec,t.getScreenX(),t.getScreenY());
}
}
});
}
}
类CustomPane扩展了FlowPane{
公共自定义窗格(){
//设置对齐(位置中心);
setHgap(25);
setVgap(25);
设置填充(新插图(20));
}
公共自定义窗格getPane(){
归还这个;
}
}
它应该在将整个代码复制/粘贴到java项目后工作。所以我删除了所有不必要的东西,我把图像换成了矩形,现在这个程序看起来有点愚蠢;P 我在有问题的一行中添加了注释。我希望现在比以前清楚多了。

试试这个:

((CustomPane) RectangleBox.this.getParent()).getChildren().remove(RectangleBox.this);

希望有帮助。

谢谢!我现在觉得自己太笨了,以至于我自己都没弄明白;P