【发布时间】:2016-09-06 13:42:05
【问题描述】:
我尝试在TableView 列中设置Button,但我没有成功设置不同的按钮。它在所有列上显示相同的按钮。
这个想法是正确设置了名称,但我的问题是当我设置cellValueFactory 时。这是我的代码:
for (int i = 0; i < listaPatchuriPerBaza.length; i++) {
if (listaPatchuriPerBaza[i].contains(".sql")) {
k = i;
pozitie = poz;
Patch pt = new Patch(listaPatchuriPerBaza[i], "Run" + " " + listaPatchuriPerBaza[i]);
listaPatchuri.add(pt);
masterData.add(pt);
patchColumn.setCellValueFactory(new PropertyValueFactory<Patch, String>("denumire"));
runColumn.setCellValueFactory(new PropertyValueFactory<Patch, String>("btnText"));
runColumn.setCellFactory(new Callback<TableColumn<Patch, String>, TableCell<Patch, String>>() {
@Override
public TableCell<Patch, String> call(TableColumn<Patch, String> param) {
Button btn = new Button(pt.getBtnText());
//Set up the Table
TableCell<Patch, String> cell = new TableCell<Patch, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
//actioneaza butonul de run
btn.setOnAction((ActionEvent event) -> {
btn.setDisable(true);
Tooltip tool = new Tooltip("Running");
setTooltip(tool);
System.out.println("ruleaza");
try {
SmbFile script = new SmbFile(path + pt.getDenumire(), userCred);
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
SmbFile smbFromFile = new SmbFile(path + pt.getDenumire(), userCred);
SmbFile smbToFile = new SmbFile(path + "Aplicate/" + pt.getDenumire(), userCred);
smbFromFile.renameTo(smbToFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
setGraphic(btn);
}
}
};
return cell;
}
});
}
tableView.setItems(masterData);
}
【问题讨论】:
-
我不明白这里的
for循环:您是否要为表格中的每一行设置一次单元格值工厂和单元格工厂? -
@James_D 是的,我想为列表中的每个元素设置,但我无法设置按钮。名字没问题。
-
这没有意义。该列只有一个工厂用于值和一个工厂用于单元格。所以你只是在循环的每次迭代中替换它们。它们是工厂:即,它们被调用来根据需要创建对象。
-
@James_D 你能在我错的地方修改我的代码吗?
-
在 Windows 中截屏的正确方法是:按住 Alt 并按一次 PrintScreen 键;按开始按钮,输入
paint,回车;当画图窗口出现时,按住 Ctrl 并输入v;然后保存文件(PNG格式,应该是默认的)。
标签: java javafx tableview tablecolumn