2015-02-09 89 views
2

我正在編寫一個顯示JavaFX表的程序。我瞭解如何通過「Column.setCellFactory(TextFieldTableCell.forTableColumn())」來編輯特定列中的所有數據;「在JavaFX中使單個單元格可編輯tableview

但是我想讓一些單元格可編輯,而其他單元格不可變。這可能嗎?此外,我希望可編輯單元格具有邊框或具有獨特的字體顏色。

回答

2

是的,這是可能的:TableCell有一個editable property繼承自Cell類。您需要安排該單元格在項目更改時相應地設置其可編輯屬性(並且可能如果控制應該可編輯的條件發生變化)。

在下面的示例中,我使用TextFieldTableCell.forTableColumn()創建默認的工廠工廠,然後創建另一個工廠。自定義單元工廠調用默認單元工廠(以獲得標準TextField行爲),然後觀察單元的itemProperty並相應更新editableProperty(在此簡單示例中,只有具有偶數value的單元纔可編輯)。

要添加邊框,您需要以某種方式更新樣式。做到這一點的最好方法是爲「可​​編輯」定義僞類,並使用外部樣式表來管理可編輯單元格的樣式。

import java.util.function.Function; 

import javafx.application.Application; 
import javafx.beans.property.BooleanProperty; 
import javafx.beans.property.IntegerProperty; 
import javafx.beans.property.SimpleIntegerProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.beans.value.ObservableValue; 
import javafx.css.PseudoClass; 
import javafx.scene.Scene; 
import javafx.scene.control.TableCell; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableRow; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.CheckBoxTableCell; 
import javafx.scene.control.cell.TextFieldTableCell; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class ConditionallyEditableTableCell extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     TableView<Item> table = new TableView<>(); 

     table.setEditable(true); 

     TableColumn<Item, String> nameCol = createCol("Name", Item::nameProperty); 
     TableColumn<Item, Number> canEditCol = createCol("Value", Item::valueProperty); 

     PseudoClass editableCssClass = PseudoClass.getPseudoClass("editable"); 

     Callback<TableColumn<Item, String>, TableCell<Item, String>> defaultTextFieldCellFactory 
      = TextFieldTableCell.<Item>forTableColumn(); 

     nameCol.setCellFactory(col -> { 
      TableCell<Item, String> cell = defaultTextFieldCellFactory.call(col); 
      cell.itemProperty().addListener((obs, oldValue, newValue) -> { 
       TableRow row = cell.getTableRow(); 
       if (row == null) { 
        cell.setEditable(false); 
       } else { 
        Item item = (Item) cell.getTableRow().getItem(); 
        if (item == null) { 
         cell.setEditable(false); 
        } else { 
         cell.setEditable(item.getValue() % 2 == 0); 
        } 
       } 
       cell.pseudoClassStateChanged(editableCssClass, cell.isEditable()); 
      }); 
      return cell ; 
     }); 

     table.getColumns().addAll(canEditCol, nameCol); 

     for (int i=1; i<=20; i++) { 
      table.getItems().add(new Item("Item "+i, i)); 
     } 

     Scene scene = new Scene(new BorderPane(table), 600, 400); 

     scene.getStylesheets().add("conditionally-editable-table-cell.css"); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private <S,T> TableColumn<S,T> createCol(String title, Function<S, ObservableValue<T>> property) { 
     TableColumn<S,T> col = new TableColumn<>(title); 
     col.setCellValueFactory(cellData -> property.apply(cellData.getValue())); 
     return col ; 
    } 

    public static class Item { 
     private final IntegerProperty value = new SimpleIntegerProperty(); 
     private final StringProperty name = new SimpleStringProperty(); 


     public Item(String name, int value) { 
      setName(name); 
      setValue(value); 
     } 

     public final StringProperty nameProperty() { 
      return this.name; 
     } 
     public final java.lang.String getName() { 
      return this.nameProperty().get(); 
     } 
     public final void setName(final java.lang.String name) { 
      this.nameProperty().set(name); 
     } 

     public final IntegerProperty valueProperty() { 
      return this.value; 
     } 
     public final int getValue() { 
      return this.valueProperty().get(); 
     } 
     public final void setValue(final int value) { 
      this.valueProperty().set(value); 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

而且樣式表,有條件編輯表-cell.css:

.table-cell:editable { 
    -fx-border-color: red ; 
} 
相關問題