我有一个表格单元工厂负责在JavaFX TableView中创建可编辑单元格.
我正在尝试为tableview实现一些附加功能,以便当用户在可编辑单元格外部单击时进行提交(编辑的文本将被保存,而不会根据默认的tableview行为进行丢弃.)
我添加了一个textField.focusedProperty()事件处理程序,我从文本字段提交文本.但是,当一个单击外部时,当前单元格cancelEdit()被调用并且调用commitEdit(textField.getText());无效.
我已经意识到,一旦cancelEdit()被称为TableCell.isEditing()返回false,所以提交永远不会发生.
如何在用户点击可编辑单元格外部时提交文本?
提交setOnEditCommit()事件处理程序后,将处理验证和数据库逻辑.我没有把它包含在这里,因为它很可能会使事情进一步复杂化.
// EditingCell - for editing capability in a TableCell
public static class EditingCell extends TableCell<Person, String> {
private TextField textField;
public EditingCell() {
}
@Override public void startEdit() {
super.startEdit();
if (textField == null) {
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); …Run Code Online (Sandbox Code Playgroud) 我想创建一个具有以下功能的表:
下面是实现这些功能的代码.值应该在焦点丢失时提交.问题:他们没有承诺.触发焦点更改事件,根据控制台输出值将是正确的,但最后表格单元格中的值是旧值.
有谁知道如何防止这种情况,你如何获得当前的EditingCell对象,以便我可以手动调用提交?毕竟,应该调用某种验证器,如果值不正确,则会阻止更改焦点.
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;
public class TableViewInlineEditDemo extends Application {
private final TableView<Person> table = new TableView<>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Jacob", "Smith", "jacob.smith@example.com"),
new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
new …Run Code Online (Sandbox Code Playgroud) 我正在尝试用Java创建一个程序来管理我的bookie帐户.我是java的新手,所以我想我会选择一些简单的东西来看看它是如何工作的.我决定使用tableview并使单个单元格可编辑.我一直在关注这个教程http://java-buddy.blogspot.co.uk/2012/04/javafx-2-editable-tableview.html.它详细介绍了如何使用java代码进行操作,并将其复制到新类中可以完美地运行.我决定尝试调整它以使用FXML,因为我喜欢Sceneviewer.我的问题是,数据被加载到表中,但当我单击/双击一个单元格时,没有任何反应.这是我的代码.
testController.java
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.util.Callback;
import java.net.URL;
import java.util.ResourceBundle;
public class testController implements Initializable {
@FXML
private TableColumn<Account, String> usernameCol;
@FXML
private TableColumn<Account, String> balanceCol;
@FXML
private TableView<Account> accountTable;
@FXML
private TableColumn<Account, String> bookieCol;
@FXML
private TableColumn<Account, String> passwordCol;
private ObservableList<Account> dataList =
FXCollections.observableArrayList(
new Account("bookie", "username", "password", "0"));
@Override
public void initialize(URL location, ResourceBundle resources) {
Callback<TableColumn, TableCell> cellFactory = …Run Code Online (Sandbox Code Playgroud) 我有一个数据类型为Integer的表列.我想使这个列可编辑,而无需在任何地方将数据类型更改为String.我使用了textfieldtablecell但它只在按下回车时提交了值.所以我想要一些其他的方法.请提出建议.为了做到[可能我做过这样的事情.但我的细胞不会变得可编辑.
public class EditCell implements initializable{
@FXML
private TableView<ResourceMaster> roletable;
@FXML
private TableColumn<ResourceMaster, Integer> loadedHrs;
@Override
public void initialize(URL location, ResourceBundle resources) {
Callback<TableColumn<ResourceMaster,Integer>, TableCell<ResourceMaster,Integer>> txtCellFactory =
(TableColumn<ResourceMaster,Integer> p) -> {return new EditingCell();};
loadedHrs.setCellFactory(txtCellFactory);
}
public class EditingCell extends TableCell<ResourceMaster, Integer> {
private TextField textField;
@Override
public void startEdit() {
if (!isEmpty()) {
super.startEdit();
if (textField == null) {
createTextField();
}
// setText(null);
commitEdit(Integer.valueOf((textField.getText())));
setGraphic(textField);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
textField.requestFocus();
}
}
@Override
public void cancelEdit() {
super.cancelEdit();
setText(String.valueOf(getItem()));
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 我需要 JavaFX TableView 的可编辑单元格。默认的 TextFieldTableCell 要求用户按 Enter 来提交更改。我认为典型的用户希望在单击单元格外部时保留更改。我想要的所有功能包括:
我在这篇文章中找到了一个 EditCell 版本, 它满足前 4 个要求,部分满足第 5 个要求,但是当用户单击表中的另一个填充单元格时,编辑更改将丢失。焦点监听器被触发,但没有提交。单击空单元格或另一个场景元素即可提交更改。
帖子中据称提供了一个解决方案, 但是,该解决方案仅包含代码片段,而不包含工作示例。我无法实施它。
任何人都可以帮助将各个部分放在一起并演示一个类,而不是扩展具有我上面列出的所有功能的 TableCell 类吗?