- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个可编辑的表,它有一个特定的列 (quantityColumn),当 setOnEditCommit 完成时,只有该列的单元格应该被禁用并且不再可编辑。所以换句话说,他们只被允许进入一次。该程序有一个添加行按钮,用于向表中添加新行,并且 setOnEditCommit 使用来自每列中每个单元格的新值更新数据库。
安 示例 我的代码的样子:
public class TableViewController implements Initializable {
/**
* Initializes the controller class.
*/
private Connection c = ConnectDB.getInstance().getConnection(); // ConnectDB is a helper that connects to the database
@FXML
private TableView<Item> table;
@FXML
private TableColumn<Item, LocalDate> dateColumn;
@FXML
private TableColumn<Item, LocalTime> timeColumn;
@FXML
private TableColumn<Item, String> quantityColumn;
@Override
public void initialize(URL url, ResourceBundle rb) {
//the following three are custom TableCell classes that allows me to make my cell have a JFX date and time picker.
Callback<TableColumn<Item, LocalDate>, TableCell<Item, LocalDate>> cellFactoryDate =
(TableColumn<Item, LocalDate> param) -> new DatePickerCell();
Callback<TableColumn<Item, LocalTime>, TableCell<Item, LocalTime>> cellFactoryTime =
(TableColumn<Item, LocalTime> param) -> new TimePickerCell();
Callback<TableColumn<Item, String>, TableCell<Item, String>> cellFactoryText =
(TableColumn<Item, String> param) -> new JFXTextFieldCell();
dateColumn.setCellValueFactory(cellData -> cellData.getValue().weekDateProperty());
timeColumn.setCellValueFactory(cellData -> cellData.getValue().timeProperty());
quantityColumn.setCellValueFactory(cellData -> cellData.getValue().quantityProperty());
dateColumn.setCellFactory(cellFactoryDate);
timeColumn.setCellFactory(cellFactoryTime);
quantityColumn.setCellFactory(cellFactoryText);
table.setEditable(true);
dateColumn.setOnEditCommit(event -> {
Item user = event.getRowValue();
user.setWeekDate(event.getNewValue());
updateDate("WeekDate", event.getNewValue(), user.getID());
});
timeColumn.setOnEditCommit(event -> {
Item user = event.getRowValue();
user.setTime(event.getNewValue());
updateTime("Time", event.getNewValue(), user.getID());
});
quantityColumn.setOnEditCommit(event -> {
Item user = event.getRowValue();
user.setQuantity(event.getNewValue());
updateQuantity("Quantity", event.getNewValue(), user.getID());
//I want to disable the cell that has been committed here
});
}
private void updateDate(String column, LocalDate date, int id) {
try {
PreparedStatement stmt = c.prepareStatement("UPDATE Items SET "+column+" = ? WHERE ID = ? ");
stmt.setDate(1, java.sql.Date.valueOf(date));
stmt.setInt(2, id);
stmt.executeUpdate();
} catch (SQLException ex) {
System.err.println("Error");
ex.printStackTrace(System.err);
}
}
private void updateTime(String column, LocalTime time, int id) {
try {
PreparedStatement stmt = c.prepareStatement("UPDATE Items SET "+column+" = ? WHERE ID = ? ");
stmt.setTime(1, java.sql.Time.valueOf(time));
stmt.setInt(2, id);
stmt.executeUpdate();
} catch (SQLException ex) {
System.err.println("Error");
ex.printStackTrace(System.err);
}
}
private void updateQuantity(String column, String quantity, int id) {
try {
PreparedStatement stmt = c.prepareStatement("UPDATE Items SET "+column+" = ? WHERE ID = ? ");
stmt.setString(1, quantity);
stmt.setInt(2, id);
stmt.executeUpdate();
} catch (SQLException ex) {
System.err.println("Error");
ex.printStackTrace(System.err);
}
}
@FXML
private void addRow(ActionEvent event) {
// get current position
TablePosition pos = table.getFocusModel().getFocusedCell();
// clear current selection
table.getSelectionModel().clearSelection();
// create new record and add it to the model
Item data = new Item();
table.getItems().add(data);
// get last row
int row = table.getItems().size() - 1;
table.getSelectionModel().select( row, pos.getTableColumn());
// scroll to new row
table.scrollTo( data);
}
}
public class Item {
private final IntegerProperty id;
private final ObjectProperty<LocalDate> weekDate;
private final ObjectProperty<LocalTime> time;
private final StringProperty quantity;
public Item() {
this(0, null, null, null);
}
/**
* Constructor with some initial data.
* @param id
* @param weekDate
* @param time
* @param quantity
*
*/
public Item(int id, LocalDate weekDate, LocalTime time, String quantity) {
this.id = new SimpleIntegerProperty(id);
this.weekDate = new SimpleObjectProperty(weekDate);
this.time = new SimpleObjectProperty(time);
this.quantity = new SimpleStringProperty(quantity);
}
public int getID() {
return id.get();
}
public void setID(int id) {
this.id.set(id);
}
public IntegerProperty idProperty() {
return id;
}
public LocalDate getWeekDate() {
return weekDate.get();
}
public void setWeekDate(LocalDate weekDate) {
this.weekDate.set(weekDate);
}
public ObjectProperty<LocalDate> weekDateProperty() {
return weekDate;
}
public LocalTime getTime() {
return time.get();
}
public void setTime(LocalTime time) {
this.time.set(time);
}
public ObjectProperty<LocalTime> timeProperty() {
return time;
}
public String getQuantity() {
return quantity.get();
}
public void setQuantity(String quantity) {
this.quantity.set(quantity);
}
public StringProperty quantityProperty() {
return quantity;
}
}
<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="disablecelltest.TableViewController">
<children>
<TableView fx:id="table" editable="true" layoutX="61.0" layoutY="70.0" prefHeight="292.0" prefWidth="479.0">
<columns>
<TableColumn fx:id="dateColumn" prefWidth="75.0" text="Date" />
<TableColumn fx:id="timeColumn" prefWidth="75.0" text="Time" />
<TableColumn fx:id="quantityColumn" prefWidth="75.0" text="Quantity" />
</columns>
</TableView>
<JFXButton buttonType="RAISED" contentDisplay="TEXT_ONLY" graphicTextGap="10.0" layoutX="10.0" layoutY="10.0" onAction="#addRow" text="ADD RECORD" textAlignment="CENTER">
<font>
<Font name="Dosis SemiBold" size="18.0" />
</font>
</JFXButton>
</children>
</AnchorPane>
public class JFXTextFieldCell extends TableCell<Item, String> {
private JFXTextField textField;
public JFXTextFieldCell() {
}
@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(item);
setGraphic(null);
} else {
if (isEditing()) {
if (textField != null) {
textField.setText(getString());
// setGraphic(null);
}
setText(null);
setGraphic(textField);
} else {
setText(getString());
setGraphic(null);
}
}
}
private void createTextField() {
textField = new JFXTextField(getString());
textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
textField.setOnAction((e) -> commitEdit(textField.getText()));
textField.focusedProperty().addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> {
if (!newValue) {
commitEdit(textField.getText());
}
});
}
private String getString() {
return getItem() == null ? "" : getItem();
}
}
最佳答案
简单地禁用(或使其不可编辑)当前单元格是行不通的;单元格将被重新分配,例如如果用户在表格周围滚动,那么错误的单元格最终将无法编辑。
您需要向模型添加一些属性(或在其他地方存储一些可以通过模型实例访问的属性)并实现一个自定义单元格来观察这些属性,从而适本地更新可编辑状态。
像下面这样的东西应该工作:
ObservableSet<Item> quantityEditedItems = FXCollections.observableSet();
quantityColumn.setCellFactory(tc -> new TextFieldTableCell<>(new IntegerStringConverter()) {
@Override
public void updateItem(Integer quantity, boolean empty) {
super.updateItem(quantity, empty) ;
editableProperty().unbind();
if (empty) {
setEditable(false);
} else {
editableProperty().bind(Bindings.createBooleanBinding(() ->
! quantityEditedItems.contains(getTableView().getItems().get(getIndex())),
quantityEditedItems));
}
}
});
quantityColumn.setOnEditCommit(event -> {
StudentPresc user = event.getRowValue(); // should this be Item?
user.setQuantity(event.getNewValue());
updateQuantity("Quantity", event.getNewValue(), user.getID());
quantityEditedItems.add(event.getRowValue());
});
import java.util.Random;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableSet;
import javafx.collections.SetChangeListener.Change;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.converter.IntegerStringConverter;
public class EditOnceTable extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
TableView<Item> table = new TableView<>();
table.setEditable(true);
TableColumn<Item, String> itemColumn = new TableColumn<>("Item");
itemColumn.setCellValueFactory(cellData -> cellData.getValue().nameProperty());
TableColumn<Item, Integer> quantityColumn = new TableColumn<>("Quantity");
quantityColumn.setCellValueFactory(cellData -> cellData.getValue().quantityProperty().asObject());
quantityColumn.setEditable(true);
table.getColumns().add(itemColumn);
table.getColumns().add(quantityColumn);
ObservableSet<Item> quantityEditedItems = FXCollections.observableSet();
quantityColumn.setCellFactory(tc -> new TextFieldTableCell<>(new IntegerStringConverter()) {
@Override
public void updateItem(Integer quantity, boolean empty) {
super.updateItem(quantity, empty) ;
editableProperty().unbind();
if (empty) {
setEditable(false);
} else {
editableProperty().bind(Bindings.createBooleanBinding(() ->
! quantityEditedItems.contains(getTableView().getItems().get(getIndex())),
quantityEditedItems));
}
}
});
quantityColumn.setOnEditCommit(event -> {
Item item = event.getRowValue(); // should this be Item?
item.setQuantity(event.getNewValue());
// updateQuantity("Quantity", event.getNewValue(), user.getID());
quantityEditedItems.add(event.getRowValue()) ;
});
ListView<Item> editedItemsView = new ListView<>();
quantityEditedItems.addListener((Change<? extends Item> change) ->
editedItemsView.getItems().setAll(quantityEditedItems)
);
editedItemsView.setCellFactory(lv -> new ListCell<>() {
@Override
protected void updateItem(Item item, boolean empty) {
super.updateItem(item, empty);
if (empty || item==null) {
setText("");
} else {
setText(item.getName());
}
}
});
Button clear = new Button("Clear edited");
clear.setOnAction(e -> quantityEditedItems.clear());
Random rng = new Random();
for (int i = 1 ; i <= 40 ; i++) {
table.getItems().add(new Item("Item "+i, rng.nextInt(100)));
}
BorderPane root = new BorderPane(table);
root.setRight(new VBox(5, new Label("Edited:"), editedItemsView, clear));
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
public static class Item {
private final StringProperty name = new SimpleStringProperty() ;
private final IntegerProperty quantity = new SimpleIntegerProperty();
public Item(String name, int quantity) {
setName(name);
setQuantity(quantity);
}
public StringProperty nameProperty() {
return name ;
}
public final String getName() {
return nameProperty().get();
}
public final void setName(String name) {
nameProperty().set(name);
}
public IntegerProperty quantityProperty() {
return quantity ;
}
public final int getQuantity() {
return quantityProperty().get();
}
public final void setQuantity(int quantity) {
quantityProperty().set(quantity);
}
}
public static void main(String[] args) {
Application.launch(args);
}
}
关于java - 在 setOnEditCommit JavaFX 后禁用 TableCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61890166/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!