使用上下文菜单从JavaFX表中删除一行

使用上下文菜单从JavaFX表中删除一行,javafx,javafx-2,javafx-8,Javafx,Javafx 2,Javafx 8,我有一个JavaFX表,当我用鼠标右键单击上下文菜单并选择“删除”时,我想删除其中的一行 导入javafx.application.application; 导入javafx.beans.property.SimpleStringProperty; 导入javafx.beans.value.ChangeListener; 导入javafx.beans.value.observeValue; 导入javafx.collections.FXCollections; 导入javafx.collecti

我有一个JavaFX表,当我用鼠标右键单击上下文菜单并选择“删除”时,我想删除其中的一行

导入javafx.application.application;
导入javafx.beans.property.SimpleStringProperty;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入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.control.TableCell;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableColumn.CellEditEvent;
导入javafx.scene.control.TableView;
导入javafx.scene.control.TextField;
导入javafx.scene.control.cell.PropertyValueFactory;
导入javafx.scene.layout.Priority;
导入javafx.scene.layout.VBox;
导入javafx.scene.text.Font;
导入javafx.stage.stage;
导入javafx.stage.WindowEvent;
导入javafx.util.Callback;
公共类MainApp扩展应用程序
{
private TableView table=new TableView();
私有最终可观测列表数据
=FXCollections.observableArrayList(
新人员(“处理人”、“72”),
新人(“RAM”、“78”),
新人(“硬盘自由空间”、“890”),
新人(“Lan适配器NIC 1”、“36”),
新人(“Lan适配器NIC 2”、“67”);
公共静态void main(字符串[]args)
{
发射(args);
}
@凌驾
公众假期开始(阶段)
{
//场景=新场景(新组());
stage.setTitle(“表格视图示例”);
//舞台设置宽度(850);
//舞台设置高度(550);
最终标签=新标签(“地址簿”);
label.setFont(新字体(“Arial”,20));
table.setEditable(假);
回叫手机工厂
=新回调()
{
@凌驾
公共TableCell调用(TableP列)
{
返回新的EditingCell();
}
};
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_策略);
TableColumn firstNameCol=新的TableColumn(“凭证”);
//firstNameCol.setPrefWidth(300);
firstNameCol.setMinWidth(50);
//firstNameCol.prefWidthProperty().bind(table.widthProperty().divide(2));//w*1/2
firstNameCol.setCellValueFactory(新属性ValueFactory(“firstName”));
firstNameCol.setCellFactory(cellFactory);
firstNameCol.setOnEditCommit(
新的EventHandler()
{
@凌驾
公共无效句柄(CellEditEvent t)
{
((Person)t.getTableView().getItems().get(
t、 getTablePosition().getRow()).setFirstName(t.getNewValue());
}
}
);
TableColumn lastNameCol=新的TableColumn(“值”);
//lastNameCol.setPrefWidth(300);
lastNameCol.setMinWidth(50);
//lastNameCol.prefWidthProperty().bind(table.widthProperty().divide(2));//w*1/2
lastNameCol.setCellValueFactory(新属性ValueFactory(“lastName”));
lastNameCol.setCellFactory(cellFactory);
lastNameCol.setOnEditCommit(
新的EventHandler()
{
@凌驾
公共无效句柄(CellEditEvent t)
{
((Person)t.getTableView().getItems().get(
t、 getTablePosition().getRow()).setLastName(t.getNewValue());
}
}
);
表2.设置项目(数据);
table.getColumns().addAll(firstNameCol,lastNameCol);
VBox VBox=新的VBox();
VBox.setVgrow(表,Priority.ALWAYS);
vbox.setspace(5);
vbox.setPadding(新插图(10,10,10,10));
vbox.getChildren().addAll(标签、表格);
场景=新场景(vbox);
舞台场景;
stage.show();
}
公共静态类人员
{
私有最终SimpleStringProperty名字;
私有最终SimpleStringProperty姓氏;
私人(字符串fName,字符串lName)
{
this.firstName=新的SimpleStringProperty(fName);
this.lastName=新的SimpleStringProperty(lName);
}
公共字符串getFirstName()
{
返回firstName.get();
}
public void setFirstName(字符串fName)
{
firstName.set(fName);
}
公共字符串getLastName()
{
返回lastName.get();
}
public void setLastName(字符串fName)
{
lastName.set(fName);
}
}
类EditingCell扩展了TableCell
{
私有文本字段文本字段;
公共编辑单元()
{
}
@凌驾
公开作废已启动IT()
{
如果(!isEmpty())
{
super.startEdit();
createTextField();
setText(空);
设置图形(文本字段);
textField.selectAll();
}
}
@凌驾
公共作废取消编辑()
{
super.cancelEdit();
setText((字符串)getItem());
设置图形(空);
}
@凌驾
public void updateItem(字符串项,布尔值为空)
{
super.updateItem(项,空);
if(空)
{
setText(空);
设置图形(空);
}
其他的
{
if(isEditing())
{
if(textField!=null)
{
setText(getString());
}
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
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.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import javafx.util.Callback;

public class MainApp extends Application
{

    private TableView<Person> table = new TableView<>();
    private final ObservableList<Person> data
        = FXCollections.observableArrayList(
            new Person("Processor", "72"),
            new Person("RAM", "78"),
            new Person("HDD Free Space", "890"),
            new Person("Lan Adapter NIC 1", "36"),
            new Person("Lan Adapter NIC 2", "67"));

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

    @Override
    public void start(Stage stage)
    {
        //Scene scene = new Scene(new Group());
        stage.setTitle("Table View Sample");
        //stage.setWidth(850);
        //stage.setHeight(550);

        final Label label = new Label("Address Book");
        label.setFont(new Font("Arial", 20));

        table.setEditable(false);
        Callback<TableColumn, TableCell> cellFactory
            = new Callback<TableColumn, TableCell>()
            {
                @Override
                public TableCell call(TableColumn p)
                {
                    return new EditingCell();
                }
            };

        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

        TableColumn firstNameCol = new TableColumn("Credentials");
        //firstNameCol.setPrefWidth(300);
        firstNameCol.setMinWidth(50);
        //firstNameCol.prefWidthProperty().bind(table.widthProperty().divide(2)); // w * 1/2

        firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
        firstNameCol.setCellFactory(cellFactory);
        firstNameCol.setOnEditCommit(
            new EventHandler<CellEditEvent<Person, String>>()
            {
                @Override
                public void handle(CellEditEvent<Person, String> t)
                {
                    ((Person) t.getTableView().getItems().get(
                        t.getTablePosition().getRow())).setFirstName(t.getNewValue());
                }
            }
        );

        TableColumn lastNameCol = new TableColumn("Value");
        //lastNameCol.setPrefWidth(300);
        lastNameCol.setMinWidth(50);
        //lastNameCol.prefWidthProperty().bind(table.widthProperty().divide(2));  // w * 1/2

        lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
        lastNameCol.setCellFactory(cellFactory);
        lastNameCol.setOnEditCommit(
            new EventHandler<CellEditEvent<Person, String>>()
            {
                @Override
                public void handle(CellEditEvent<Person, String> t)
                {
                    ((Person) t.getTableView().getItems().get(
                        t.getTablePosition().getRow())).setLastName(t.getNewValue());
                }
            }
        );

        table.setItems(data);
        table.getColumns().addAll(firstNameCol, lastNameCol);

        VBox vbox = new VBox();
        VBox.setVgrow(table, Priority.ALWAYS);
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 10, 10, 10));
        vbox.getChildren().addAll(label, table);

        Scene scene = new Scene(vbox);
        stage.setScene(scene);
        stage.show();
    }

    public static class Person
    {

        private final SimpleStringProperty firstName;
        private final SimpleStringProperty lastName;

        private Person(String fName, String lName)
        {
            this.firstName = new SimpleStringProperty(fName);
            this.lastName = new SimpleStringProperty(lName);
        }

        public String getFirstName()
        {
            return firstName.get();
        }

        public void setFirstName(String fName)
        {
            firstName.set(fName);
        }

        public String getLastName()
        {
            return lastName.get();
        }

        public void setLastName(String fName)
        {
            lastName.set(fName);
        }

    }

    class EditingCell extends TableCell<Person, String>
    {

        private TextField textField;

        public EditingCell()
        {
        }

        @Override
        public void startEdit()
        {
            if (!isEmpty())
            {
                super.startEdit();
                createTextField();
                setText(null);
                setGraphic(textField);
                textField.selectAll();
            }
        }

        @Override
        public void cancelEdit()
        {
            super.cancelEdit();

            setText((String) getItem());
            setGraphic(null);
        }

        @Override
        public void updateItem(String item, boolean empty)
        {
            super.updateItem(item, empty);

            if (empty)
            {
                setText(null);
                setGraphic(null);
            }
            else
            {
                if (isEditing())
                {
                    if (textField != null)
                    {
                        textField.setText(getString());
                    }
                    setText(null);
                    setGraphic(textField);
                }
                else
                {
                    setText(getString());
                    setGraphic(null);
                    setContextMenu(intiContextmenu());
                }
            }
        }

        private void createTextField()
        {
            textField = new TextField(getString());
            textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
            textField.focusedProperty().addListener(new ChangeListener<Boolean>()
            {
                @Override
                public void changed(ObservableValue<? extends Boolean> arg0,
                    Boolean arg1, Boolean arg2)
                {
                    if (!arg2)
                    {
                        commitEdit(textField.getText());
                    }
                }
            });
        }

        private String getString()
        {
            return getItem() == null ? "" : getItem().toString();
        }
    }

    public ContextMenu intiContextmenu()
    {

        final ContextMenu contextMenu = new ContextMenu();

        contextMenu.setOnShowing(
            new EventHandler<WindowEvent>()
            {

                @Override
                public void handle(WindowEvent e)
                {
                    System.out.println("showing");
                }
            }
        );
        contextMenu.setOnShown(new EventHandler<WindowEvent>()
        {
            @Override
            public void handle(WindowEvent e)
            {
                System.out.println("shown");
            }
        });

        MenuItem item1 = new MenuItem("About");
        item1.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent e)
            {
                System.out.println("About");
            }
        });
        MenuItem item2 = new MenuItem("Preferences");
        item2.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent e)
            {
                System.out.println("Preferences");
            }
        });

        MenuItem item3 = new MenuItem("Delete row");
        item3.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent e)
            {
                System.out.println("Delete row");
            }
        });

        contextMenu.getItems().addAll(item1, item2, item3);

        return contextMenu;

    }

}
TableView<LineItem> tv = new TableView<>(items);
Stack<LineItem> deletedLines = new Stack<>();
tv.setUserData(deletedLines);
MenuItem mnuDel = new MenuItem("Delete row");
mnuDel.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent t) {
        LineItem item = items.get(tv.getSelectionModel().getSelectedIndex());
        if (item != null){ 
            String fn = item.getFirstName();
            deletedLines.push(items.remove(item));
        }
    }
});
MenuItem mnuUnDel = new MenuItem("Undo Delete");
mnuUnDel.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent t) {
        if (!deletedLines.isEmpty())items.add(deletedLines.pop());
    }
});
tv.setContextMenu(new ContextMenu(mnuDel,mnuUnDel));
   MenuItem item3 = new MenuItem("Delete row");
        item3.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent e)
            {
                System.out.println("Delete row");
                Person p = table.getSelectionModel().getSelectedItem();
                if(p!=null) {
                    data.remove(p);
                }
            }
        });
private TableView<Person> table = new TableView<Person>();

...

table.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {  
        @Override  
        public TableRow<Person> call(TableView<Person> tableView) {  
            final TableRow<Person> row = new TableRow<>();  
            final ContextMenu contextMenu = new ContextMenu();  
            final MenuItem removeMenuItem = new MenuItem("Remove");  
            removeMenuItem.setOnAction(new EventHandler<ActionEvent>() {  
                @Override  
                public void handle(ActionEvent event) {  
                    table.getItems().remove(row.getItem());  
                }  
            });  
            contextMenu.getItems().add(removeMenuItem);  
           // Set context menu on row, but use a binding to make it only show for non-empty rows:  
            row.contextMenuProperty().bind(  
                    Bindings.when(row.emptyProperty())  
                    .then((ContextMenu)null)  
                    .otherwise(contextMenu)  
            );  
            return row ;  
        }  
    });