我构建了一个用于显示数据的小JavaFX TableView。用户应该能够在桌面视图中编辑数据。问题是:某些字段只允许特定值。如果用户输入了错误的值,则该字段设置为0。
这是我的班级:
private ObservableList shots;
@FXML
void initialize() {
this.shots = FXCollections.observableArrayList(match.getShots()); // values from database
tblShots.setItems(shots);
tblShots.setEditable(true);
lblserienid.setText(GUIConstants.idPlaceHolder);
lblresult.setText(GUIConstants.idPlaceHolder);
colShotID.setCellValueFactory(new PropertyValueFactory<Schuss, String>("idSchuss"));
colRing.setCellValueFactory(new PropertyValueFactory<Schuss, String>("ringString"));
colRing.setCellFactory(TextFieldTableCell.forTableColumn());
colRing.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Schuss, String>>() {
@Override
public void handle(TableColumn.CellEditEvent<Schuss, String> t) {
Schuss s = (Schuss) t.getTableView().getItems().get(
t.getTablePosition().getRow());
try {
int ring = Integer.parseInt(t.getNewValue());
s.setRing(ring);
} catch (Exception ex) {
s.setRing(0);
}
SerienauswertungViewController.this.refreshTable();
}
});
colRing.setEditable(true);
// .... omitted
}
private void refreshTable(){
if(shots.size()>0) {
btnDeleteAll.setDisable(false);
btnEdit.setDisable(false);
int res = 0;
for(int i=0;i<shots.size();i++){
Schuss s = (Schuss)shots.get(i);
res += s.getRing();
}
lblresult.setText(""+res);
}
else {
btnDeleteAll.setDisable(true);
btnEdit.setDisable(true);
lblresult.setText(GUIConstants.idPlaceHolder);
}
}
所以当我编辑一个tableviewcell并输入“q”(这个值是不允许的)并按Enter时,调试器在上面的catch块中跳转,将观察列表中的特定值设置为0(我可以在调试器中看到这一点,当我展开这个对象时)但是tableviewcell仍然显示q而不是0(系统已经纠正了)...
为什么tableview没有显示观察列表对象的正确值???
虽然刷新(refresh()肯定与升级到8u60(代码)配合使用,但我所从事的大型项目目前仍停留在8u51(代码)上,短期内无法合理地移动到u60(代码)。我尝试在Rainer引用的refresh()
中实现代码,以代替上面提到的其他kluges,特别是设置列为不可见/可见。然而,简单地实现
getProperties().put(TableViewSkinBase.RECREATE, Boolean.TRUE);
未在u51内工作。在进行更多的谷歌搜索后,我在这里遇到了JavaFx/Oracle Jira问题:
https://bugs.openjdk.java.net/browse/JDK-8098085
如果打开rt22599。补丁附件您将发现各种皮肤的变化,特别是针对TableViews、TableViewSkinBase的变化。此模块未在src javafx中提供。jdk安装附带的zip。正在查找有关如何将SkinBase更改整合到u51安装的信息。
好吧,这似乎是一个错误。我使用了一个工作,这里提到了:
tblShots.getColumns().get(1).setVisible(false);
tblShots.getColumns().get(1).setVisible(true);
这是必需的,但自Java8u60以来是全新的(是的,他们在udpate中更改了API!)TableView本身有一个refresh()方法。
/**
* Calling {@code refresh()} forces the TableView control to recreate and
* repopulate the cells necessary to populate the visual bounds of the control.
* In other words, this forces the TableView to update what it is showing to
* the user. This is useful in cases where the underlying data source has
* changed in a way that is not observed by the TableView itself.
*
* @since JavaFX 8u60
*/
public void refresh() {
getProperties().put(TableViewSkinBase.RECREATE, Boolean.TRUE);
}
它太新了,甚至在甲骨文官方文档中都没有。。。所以我无法提供链接。
干杯
在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图。但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好。打开Models \ Movie.cs文件,并添加高亮行如下所示: using System; using System.ComponentModel.DataAnnotations; using System.Data.E
我创建了一个TableView,其中包含一个复选框列(isSelected)和三个信息列(姓名、姓氏、职务)。我想根据用户信息禁用一些复选框。例如,如果用户名为“Peter”,则Peter旁边的复选框将被禁用。但我不能。以下是我的一些代码: 人JAVA 控制器。JAVA
我使用进行单元格编辑,并在Editable=true的上使用验证器。如果选择的P:SelectoneMenu值或键入的值无效,我希望单元格编辑状态保持在编辑模式(第二个屏幕截图),并像使用常规表单(第三个屏幕截图)一样在输入周围显示红色框。当验证失败时,会显示咆哮和消息,但下拉框周围的红色框不会持续存在,我担心用户可能不会注意到(第一张屏幕截图)。我不知道如何进行ajax更新来显示红色框,但保持单
我已经为我的组织的需求添加了一些自定义属性到注册字段。根据文档自定义了主题并添加了验证。很好用。我可以添加这些属性到帐户管理页面也通过修改帐户模板。
不久前,我开始在我的项目中使用google play服务。错误是随机出现的。当我进入Windows/Google Play Games/Setup/Android Setup时。。。然后单击“设置”,错误消失,但经过几次编译后,它再次出现。我不知道是什么导致了这个问题。 我认为这与谷歌游戏有关,但之前没有发生过,所以我不确定是否是这样。 NullReferenceException:对象引用未设置
在JavaFX 8中,我尝试在将新行添加到表中后编辑单元格,以优化用户体验。 选择了正确的行,但单元不会进入编辑模式。嗯,我很偶然地看到了这种情况,但很难再现。我做错了什么?