2012-10-15 62 views
0

我想在tableview上使用編輯。 我用這個tut作爲參考: http://docs.oracle.com/javafx/2/ui_controls/table-view.htm# 但我使用fxml文件進行創建(使用jafafx場景生成器)。 我已經檢查了表格和列(在場景生成器中)的可編輯複選框,但是如果我執行該程序,我無法編輯這些值。我從嘖嘖下載示例項目和編輯那裏工作......所以,在我的項目文本字段doesn't得到開:( 控制器:javafx tableview - 無法編輯

public class StatesPopupController implements Controllerable, Initializable 
{ 
// <editor-fold desc="fxml import stuff" defaultstate="collapsed"> 
    @FXML // fx:id="guiStatesTable" 
    private TableView<StateData> guiStatesTable; // Value injected by FXMLLoader 
    @FXML // fx:id="guiColorColumn" 
    private TableColumn<StateData, String> guiColorColumn; // Value injected by FXMLLoader 
    @FXML // fx:id="guiFontEffectColumn" 
    private TableColumn<StateData, String> guiFontEffectColumn; // Value injected by FXMLLoader 
    @FXML // fx:id="guiUseColumn" 
    private TableColumn<StateData, String> guiUseColumn; // Value injected by FXMLLoader 
    @FXML // fx:id="guiValueColumn" 
    private TableColumn<StateData, String> guiValueColumn; // Value injected by FXMLLoader 
    @FXML // fx:id="guiStateAddColor" 
    private TextField guiStateAddColor; // Value injected by FXMLLoader 
    @FXML // fx:id="guiStateAddFontEffect" 
    private TextField guiStateAddFontEffect; // Value injected by FXMLLoader 
    @FXML // fx:id="guiStateAddUse" 
    private TextField guiStateAddUse; // Value injected by FXMLLoader 
    @FXML // fx:id="guiStateAddValue" 
    private TextField guiStateAddValue; // Value injected by FXMLLoader 
// </editor-fold> 

    private Modelable model = null; 

    public StatesPopupController() 
    { 
    this.model = new StatesPopupModel(); 
    } 

    @Override 
    public Modelable getModel(){ 
    return model; 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) 
    { 
    this.guiStatesTable.setEditable(true); 
    this.guiValueColumn.setCellValueFactory(new PropertyValueFactory<StateData, String>("value")); 
    this.guiColorColumn.setCellValueFactory(new PropertyValueFactory<StateData, String>("color")); 
    this.guiUseColumn.setCellValueFactory(new PropertyValueFactory<StateData, String>("use")); 
    this.guiFontEffectColumn.setCellValueFactory(new PropertyValueFactory<StateData, String>("fontEffect")); 
    this.guiStatesTable.setItems(((StatesPopupModel)this.model).getTableData()); 
    } 

    public void newAddBtnEvent(ActionEvent event) 
    { 
    ((StatesPopupModel)this.model).addDataEntry(guiStateAddValue.getText(), guiStateAddColor.getText(), guiStateAddUse.getText(), guiStateAddFontEffect.getText()); 
    guiStateAddValue.clear(); 
    guiStateAddColor.clear(); 
    guiStateAddUse.clear(); 
    guiStateAddFontEffect.clear(); 
    this.guiStatesTable.setItems(((StatesPopupModel)this.model).getTableData()); 
    } 

    public void newEditValueEvent(CellEditEvent<StateData, String> event) 
    { 
    ((StateData)event.getTableView().getItems().get(event.getTablePosition().getRow())).setValue(event.getNewValue()); 
    } 

    public void newEditColorEvent(ActionEvent event) 
    { 
    System.out.print("asd"); 
    } 

    public void newEditUseEvent(ActionEvent event) 
    { 

    } 

    public void newEditFontEffectEvent(ActionEvent event) 
    { 

    } 
} 

型號:

public class StatesPopupModel implements Modelable 
{ 
    private ObservableList<StateData> data = FXCollections.observableArrayList(
     new StateData("inactive", "9", "permit", "plain"), 
     new StateData("active", "2", "permit", "plain"), 
     new StateData("unavailable", "7", "inhibit", "plain"), 
     new StateData("available", "2", "permit", "plain"), 
     new StateData("invisible", "2", "inhibit", "plain"), 
     new StateData("visible", "4", "permit", "plain"), 
     new StateData("controlSign", "10", "inhibit", "plain"), 
     new StateData("label", "5", "permit", "plain")); 

    public void addDataEntry(String value, String color, String use, String fontEffect){ 
    data.add(new StateData(value, color, use, fontEffect)); 
    } 

    public ObservableList<StateData> getTableData(){ 
    return data; 
    } 
} 

的statedata:

public class StateData 
{ 
    private final SimpleStringProperty value; 
    private final SimpleStringProperty color; 
    private final SimpleStringProperty use; 
    private final SimpleStringProperty fontEffect; 

    public StateData(String value, String color, String use, String fontEffect) 
    { 
    this.value = new SimpleStringProperty(value); 
    this.color = new SimpleStringProperty(color); 
    this.use = new SimpleStringProperty(use); 
    this.fontEffect = new SimpleStringProperty(fontEffect); 
    } 

    /** 
    * @return the value 
    */ 
    public String getValue() 
    { 
    return value.get(); 
    } 

    /** 
    * @param value the value to set 
    */ 
    public void setValue(String value) 
    { 
    this.value.set(value); 
    } 

    /** 
    * @return the color 
    */ 
    public String getColor() 
    { 
    return color.get(); 
    } 

    /** 
    * @param color the color to set 
    */ 
    public void setColor(String color) 
    { 
    this.color.set(color); 
    } 

    /** 
    * @return the use 
    */ 
    public String getUse() 
    { 
    return use.get(); 
    } 

    /** 
    * @param use the use to set 
    */ 
    public void setUse(String use) 
    { 
    this.use.set(use); 
    } 

    /** 
    * @return the fontEffect 
    */ 
    public String getFontEffect() 
    { 
    return fontEffect.get(); 
    } 

    /** 
    * @param fontEffect the fontEffect to set 
    */ 
    public void setFontEffect(String fontEffect) 
    { 
    this.fontEffect.set(fontEffect); 
    } 
} 

這裏的FXML:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.text.*?> 

<AnchorPane id="AnchorPane" minHeight="397.0" minWidth="264.0" prefHeight="397.0" prefWidth="427.0" xmlns:fx="http://javafx.com/fxml" fx:controller="controller.popup.StatesPopupController"> 
    <children> 
    <Label text="States" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="6.0"> 
     <font> 
     <Font name="System Bold" size="15.0" /> 
     </font> 
    </Label> 
    <TableView fx:id="guiStatesTable" editable="true" prefHeight="311.0" prefWidth="236.0" AnchorPane.bottomAnchor="52.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="34.0"> 
     <columns> 
     <TableColumn prefWidth="75.0" text="Value" fx:id="guiValueColumn" /> 
     <TableColumn prefWidth="75.0" text="Color" fx:id="guiColorColumn" /> 
     <TableColumn prefWidth="75.0" text="Use" fx:id="guiUseColumn" /> 
     <TableColumn prefWidth="75.0" text="fontEffect" fx:id="guiFontEffectColumn" /> 
     </columns> 
    </TableView> 
    <HBox id="HBox" alignment="CENTER" prefWidth="236.0" spacing="5.0" AnchorPane.bottomAnchor="17.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0"> 
     <children> 
     <TextField fx:id="guiStateAddValue" prefWidth="93.0" promptText="Value" /> 
     <TextField fx:id="guiStateAddColor" prefWidth="79.0" promptText="Color" /> 
     <TextField fx:id="guiStateAddUse" prefWidth="79.0" promptText="Use" /> 
     <TextField fx:id="guiStateAddFontEffect" prefWidth="79.0" promptText="Font Effect" /> 
     <Button mnemonicParsing="false" onAction="#newAddBtnEvent" text="Add" /> 
     </children> 
    </HBox> 
    </children> 
</AnchorPane> 

每一個幫助是值得歡迎的。

編輯: 如果我使用:

....setCellFactory(TextFieldTableCell.forTableColumn()); 

我收到此錯誤:

error: method setCellFactory in class TableColumn<S,T> cannot be applied to given types; 
    guiUseColumn.setCellFactory(TextFieldTableCell.forTableColumn()); 
       ^
    required: Callback<TableColumn<StateData,String>,TableCell<StateData,String>> 
    found: Callback<TableColumn<Object,String>,TableCell<Object,String>> 
    reason: actual argument Callback<TableColumn<Object,String>,TableCell<Object,String>> cannot be converted to Callback<TableColumn<StateData,String>,TableCell<StateData,String>> by method invocation conversion 
    where S,T are type-variables: 
    S extends Object declared in class TableColumn 
    T extends Object declared in class TableColumn 
+0

我不明白。這個吸盤只是不打開文本域 – immerhart

+0

我有完全相同的問題。問題似乎是TextFieldTableCell。forTableColumn()使用泛型作爲方法簽名如下: public static Callback ,TableCell > forTableColumn() 我還沒有想出如何調用靜態方法使用泛型。 –

回答

2

爲了TableView編輯你應該還提供了CellFactory它將處理編輯控件的創建。

你可以找到相應的這裏的教程的一部分:http://docs.oracle.com/javafx/2/ui_controls/table-view.htm#sthref119

+0

是的,我也試過。但我得到這個錯誤:(請參閱主文章)你知道如何解決這個問題嗎? – immerhart

+1

我用給定的參數創建了一個新的回調,它現在可以工作了!謝謝。 – immerhart

+3

@immerhart發佈您提出的解決方案將有助於SO社區接受不提供解決方案的答案。 –

4

試試這個:

....setCellFactory(TextFieldTableCell.<StateData>forTableColumn()); 
0

我有同樣的問題,我沒有發現與分離FXML視圖和控制器合適的解決方案。我也想堅持這種模式。上面提到的例子並不適合我。所以我稍微修改了this tutorial

該解決方案包括一個自定義TableCellFactory。這是需要改變TableCellTextFieldTableCell並添加以下內容:

cell.setConverter(new StringConverter<T>() { 
      @Override 
      public String toString(T object) { 
       return object.toString(); 
      } 
      @Override 
      public T fromString(String string) { 
       return (T) string; 
      } 
     }); 

在控制器的新方法處理的變化。例如

@FXML 
protected void changeFirstName(CellEditEvent<Person, String> event) { 
    ((Person) event.getTableView().getItems().get(event.getTablePosition().getRow())).setFirstName(event.getNewValue()); 
} 

參考是FXML文件

<TableColumn fx:id="firstNameColumn" text="First Name" prefWidth="100" onEditCommit="#changeFirstName"> 

你可以在我的full Maven example富有變化。

相關問題