在TableView中排编辑(Row edit in TableView)

2019-09-27 09:58发布

我有一个TableView使用JavaFX(2.2 / Java 7的是具体的),其中每列可排序(实时排序)和所有行/列可编辑。 举个例子,假设整个表代表“订单”。 表中的每一行,代表“订单行”,各列代表“订单”的特性,如“产品”,“数量”,“价格”等。用户可以添加,删除和编辑行(“顺序线“),因为他的愿望。

为了使UI为用户减少混乱,我想用行选择,也确保只有一行是可编辑的同时(因为分拣否则将使得当前编辑值表中的“跳跃”周围) 。 我也有每“订单”,这是更容易形象化为一排,而不是单独的列(作为一个例子,假设该组合或产品X和数量7是非法的验证,如产品X只能在单元订购5,我想强调两个X和值7)。

行选择可以很容易地启用。 但是,有没有实现行编辑的好办法 ? 默认/内置的编辑模式在TableView更像是Excel的每列可被编辑,提交和验证个人,这不是我想要的。 我想是这样的文件资源管理器的文件列表。 重要的是,对于编辑行的所有编辑都致力于后盾模型( items的财产TableView一次)(即没有onEditCommit单独的列),因为排序和验证。

我实现了之前在Swing类似的东西,然后结束了使用什么我命名为ColumnList ,这实在是一个List ,但列标题和列,使它看起来就像一个表。 这是否是一个可行的选择,在JavaFX的呢? 该TableColum类似乎很绑定TableView ,但我可能失去了一些东西。

我也是知道的“地址簿”例如,在JavaFX的教程,它具有如下表行选择和编辑的字段。 这是我目前在我的应用程序实现的,但我想编辑出现在网上与当前所选行。 因此,使得编辑出现在“上面”或“内部”当前所选行也将是一个选择,如果任何人都可以想出一个方法来实现这一目标。

Answer 1:

你总是可以让你自己的编辑器对话框,并根据需要流行起来在桌子上。 这不是一个很好的解决方案,但与一些调整,它可能是好的。 DBL单击编辑一行。

import javafx.application.Application;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
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.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class TableEdit extends Application {

    @Override
    public void start(Stage primaryStage) {
        TableView<Order> tv = new TableView<>();
        ObservableList<Order> items = FXCollections.observableArrayList(
                new Order("a-12", 100), new Order("b-23", 200), new Order("c-34", 300));
        tv.setItems(items);

        TableColumn<Order, String> tcNum = new TableColumn("Order#");
        tcNum.setPrefWidth(100);
        TableColumn<Order, Number> tcQty = new TableColumn("Qty");
        tcQty.setPrefWidth(100);
        tcNum.setCellValueFactory(new PropertyValueFactory<>("orderNum"));
        tcQty.setCellValueFactory(new PropertyValueFactory<>("qty"));
        tv.getColumns().addAll(tcNum, tcQty);

        HBox hbox = new HBox();
        TextField orderNum = new TextField();
        orderNum.setPrefWidth(100);
        TextField qty = new TextField();
        qty.setPrefWidth(100);

        tv.getSelectionModel().selectedItemProperty().addListener((obs, ov, nv) -> {
            if (nv != null) {
                orderNum.setText(nv.orderNum.get());
                qty.setText(String.valueOf(nv.qty.get()));
            }
        });

        Button commit = new Button("Commit");
        commit.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent evt) {
                Order item = tv.getSelectionModel().getSelectedItem();
                item.orderNum.set(orderNum.getText());
                item.qty.set(Integer.valueOf(qty.getText()));
                tv.toFront();
            }
        });

        hbox.getChildren().addAll(orderNum, qty, commit);
        StackPane root = new StackPane(hbox, tv);

        tv.setOnMouseClicked(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent evt) {
                if (evt.getClickCount()==2){
                    StackPane.setMargin(hbox, new Insets(evt.getSceneY(), 0, 0, 0));
                    hbox.toFront();
                }
            }
        });

        Scene scene = new Scene(root, 300, 250);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

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

    public class Order {

        private final SimpleStringProperty orderNum = new SimpleStringProperty();
        private final SimpleIntegerProperty qty = new SimpleIntegerProperty();

        public SimpleStringProperty orderNumProperty() {return orderNum;}
        public SimpleIntegerProperty qtyProperty() {return qty;}

        public Order(String orderNum, int qty) {
            this.orderNum.set(orderNum);
            this.qty.set(qty);
        }
    }
}



文章来源: Row edit in TableView