gpt4 book ai didi

java - TableView 中的行编辑

转载 作者:行者123 更新时间:2023-11-29 05:23:04 25 4
gpt4 key购买 nike

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

为了减少 UI 对用户的混淆,我想使用行选择,并确保一次只能编辑一行(否则排序会使当前编辑的值在 table )。我还对每个“订单行”进行了验证,这对于行而不是单个列更容易可视化(例如,假设组合或产品 X 和数量 7 是非法的,因为产品 X 只能按单位订购5,我想同时突出显示 X 和值 7)。

可以轻松启用行选择。但是是否有实现行编辑的好方法TableView 中的默认/内置编辑模式更像是 Excel 的编辑模式,其中每一列都可以单独编辑、提交和验证,这不是我想要的。我想要类似文件资源管理器中的文件列表的东西。重要的是,对已编辑行的所有编辑都立即提交到支持模型(TableViewitems 属性)(即没有 onEditCommit 对于单个列)因为排序和验证。

我以前在 Swing 中实现过类似的东西,然后最终使用了我命名为 ColumnList 的东西,它实际上是一个 List,但带有列标题和列, 使它看起来像一张 table 。这在 JavaFX 中也是一个可行的选择吗? TableColum 类似乎非常绑定(bind)到 TableView,但我可能遗漏了一些东西。

我也知道 JavaFX 教程中的“地址簿”示例,它在表格下方有行选择和编辑器字段。这是我目前在我的应用程序中实现的,但我希望编辑与当前选定的行一致。因此,让编辑器出现在当前所选行的“顶部”或“内部”也是一种替代方法,如果有人能想出办法实现的话。

最佳答案

您始终可以制作自己的编辑器框,并根据需要将其弹出到表格上方。这不是一个很好的解决方案,但通过一些调整可能会很好。 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);
}
}
}

enter image description here

关于java - TableView 中的行编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23884190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com