2017-09-05 82 views
2

目前我有一個模型程序hereJavaFX - 更改桌面單元格中的文本

我想要發生的是,當用戶輸入當前顯示在表格中的名稱並單擊「更改」按鈕時,它會將指定名稱的項目/行的「狀態」列文本更改爲另一個文本,如 「運行」

目前,我有以下代碼:

Controller.java

public class Controller implements Initializable { 
    @FXML 
    TableView<TableRow> tableView; 
    @FXML 
    TableColumn<TableRow, String> tbc_name; 
    @FXML 
    TableColumn<TableRow, String> tbc_status; 

    ObservableList<TableRow> rows = FXCollections.observableArrayList(); 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     tbc_name.setCellValueFactory(new PropertyValueFactory<TableRow, String>("name")); 
     tbc_status.setCellValueFactory(new PropertyValueFactory<TableRow, String>("status")); 

     tableView.getItems().setAll(gettableRows()); 

     System.out.println("started"); 
    } 

    public ObservableList<TableRow> gettableRows() { 
     rows.add(new TableRow("Name1", "none")); 
     rows.add(new TableRow("Name2", "none")); 
     rows.add(new TableRow("Name3", "none")); 

     return rows; 

    } 
} 


TableRow.java

public class TableRow { 
    private String name; 
    private String status; 

    public TableRow(){ 
     this.name = ""; 
     this.status = ""; 
    } 

    public TableRow(String name_, String status_){ 
     name = name_; 
     status = status_; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 
} 

爲了更好地瞭解什麼,我想實現,在C#我可以用下面的代碼來改變在ListView特定單元格的文本:

ListViewItem lvi = listview1.FindItemWithText(username); 
lvi.Subitems[3].Text = "Running..."; 

任何幫助讚賞。

回答

3

如果你有一個模型類來表示的tableView一排,那麼你可以使用它作爲cellValueFactory,所以重構這些行:

tbc_name.setCellValueFactory(new PropertyValueFactory<TableRow, String>("name")); 
    tbc_status.setCellValueFactory(new PropertyValueFactory<TableRow, String>("status")); 

到:

tbc_name.setCellValueFactory(data -> data.getValue().nameProperty()); 
tbc_status.setCellValueFactory(data -> data.getValue().statusProperty()); 

和重構TableRow類爲:

public class TableRow { 

    private StringProperty name; 
    private StringProperty status; 

    public TableRow(String name, String status) { 
     this.name = new SimpleStringProperty(name); 
     this.status = new SimpleStringProperty(status); 
    } 

    public String getName() { 
     return name.get(); 
    } 

    public StringProperty nameProperty() { 
     return name; 
    } 

    public String getStatus() { 
     return status.get(); 
    } 

    public StringProperty statusProperty() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status.set(status); 
    } 
} 

然後你必須用一個textField擴展控制器(上面的Textfield更改按鈕)和一個按鈕(更改)。

change.setOnAction(action ->{ 
    String text = changeTextField.getText(); 
    tableView.getItems().stream() 
         .filter(row -> row.getName().equals(text)) 
         .findFirst() 
         .ifPresent(row -> row.setStatus("Running")); 
}); 
+0

非常感謝,完美的作品! – mclarence