2016-09-13 17 views
0

は私のコードは、JavaFXのツリービュー編集項目

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.control.cell.TextFieldTreeCell; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import javafx.util.*; 

public class TreeViewSample extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 
    TreeView<Object> tree; 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("Tree View Sample"); 

     TreeItem<Object> rootItem = new TreeItem<Object>("Tree"); 
     rootItem.setExpanded(true); 
     for (int i = 1; i < 6; i++) { 
      TreeItem<Object> item = new TreeItem<Object>("Item" + i); 
      rootItem.getChildren().add(item); 
     } 

     ContextMenu menu = new ContextMenu(); 
     MenuItem renameItem = new MenuItem("Rename"); 
     menu.getItems().add(renameItem); 

     tree = new TreeView<Object>(rootItem); 
     tree.setContextMenu(menu); 
     tree.setEditable(true); 

     tree.setCellFactory(new Callback<TreeView<Object>, TreeCell<Object>>() { 
      @Override 
      public TreeCell<Object> call(TreeView<Object> p) { 
       return new TextFieldTreeCell<Object>(); 
      } 
     }); 
     renameItem.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       tree.edit(tree.getSelectionModel().getSelectedItem()); 
      } 
     }); 

     tree.setOnEditCommit(new EventHandler<TreeView.EditEvent<Object>>() { 
      @Override 
      public void handle(TreeView.EditEvent<Object> event) { 
       System.out.println("Commit Value"); 
      } 
     }); 
     StackPane root = new StackPane(); 
     root.getChildren().add(tree); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 
    } 
} 

であり、値をコミットし、

TreeViewTreeItemジェネリック型は、私が持っているStringある場合return new TextFieldTreeCell<String>(new DefaultStringConverter());

私はObjectを使用 使用し、私はどのLEA 文字列コンバータを使用する方法がわかりませんdsから、

Exception in thread "JavaFX Application Thread" java.lang.IllegalStateException: 
Attempting to convert text input into Object, but provided StringConverter is null. Be sure to set a StringConverter in your cell factory. 

この例外を緩和するにはどうすればよいですか?

答えて

1

TreeViewObjectのインスタンスを表示することは、表示する情報を格納していないため意味がありません。

具体的には、以下のStringConverterはエラーを除去するのに役立ちます:

tree.setCellFactory(new Callback<TreeView<Object>, TreeCell<Object>>() { 
    @Override 
    public TreeCell<Object> call(TreeView<Object> p) { 
     return new TextFieldTreeCell<Object>(new StringConverter<Object>(){ 

      @Override 
      public String toString(Object object) { 
       return object.toString(); 
      } 

      @Override 
      public Object fromString(String string) { 
       return new Object(); 
      } 
     }); 
    } 
}); 

それは何:それはコミットのTextField(に入力された任意の文字列から新しいObjectインスタンスを返しますStringConverter定義Objectには識別する情報が格納されていないので、これはあなたが持つことができる最高のものです)ObjectインスタンスのtoString()メソッドから取得したStringを表示します。

but:TreeViewに表示するデータモデルを提供する必要があります。表示できるテキストデータは少なくとも保存できます。

私は本当に単純なデータモデルに裏打ちされたTreeViewを作成するようにコードを更新しました:

それは1つの単一のプロパティを持つクラスツリー(Itemクラス)のデータモデルを定義しますアイテムの名前TreeViewの汎用パラメータはItemクラスに設定されているため、TreeViewItemのインスタンスを表示できます。

あなたは、私が今はるかに理にかなっている、またStringConverterを定義している見ることができるように:入力したテキストがコミットされたときに、fromString方法は、その名前を持っていること、この場合には方法は、新しいItemインスタンスを返しますが、実行されます入力文字列に設定します。 Itemインスタンスをテキスト形式で表示する方法を指定するには、toStringメソッドが必要です。私たちの場合、特定のインスタンスの名前が返されます。

import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.control.cell.TextFieldTreeCell; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import javafx.util.*; 

public class TreeViewSample2 extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 
    TreeView<Item> tree; 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("Tree View Sample"); 

     TreeItem<Item> rootItem = new TreeItem<Item>(new Item("Root")); 


     rootItem.setExpanded(true); 
     for (int i = 1; i < 6; i++) { 
      TreeItem<Item> item = new TreeItem<Item>(new Item("Item"+i)); 
      rootItem.getChildren().add(item); 
     } 

     ContextMenu menu = new ContextMenu(); 
     MenuItem renameItem = new MenuItem("Rename"); 
     menu.getItems().add(renameItem); 

     tree = new TreeView<Item>(rootItem); 
     tree.setContextMenu(menu); 
     tree.setEditable(true); 

     tree.setCellFactory(new Callback<TreeView<Item>, TreeCell<Item>>() { 
      @Override 
      public TreeCell<Item> call(TreeView<Item> p) { 
       return new TextFieldTreeCell<Item>(new StringConverter<Item>(){ 

        @Override 
        public String toString(Item object) { 
         return object.getName(); 
        } 

        @Override 
        public Item fromString(String string) { 
         return new Item(string); 
        } 
       }); 
      } 
     }); 
     renameItem.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       tree.edit(tree.getSelectionModel().getSelectedItem()); 
      } 
     }); 

     tree.setOnEditCommit(new EventHandler<TreeView.EditEvent<Item>>() { 
      @Override 
      public void handle(TreeView.EditEvent<Item> event) { 
       System.out.println("Commit Value"); 
      } 
     }); 
     StackPane root = new StackPane(); 
     root.getChildren().add(tree); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 
    } 
} 

class Item { 
    private SimpleStringProperty name = new SimpleStringProperty(""); 
    public SimpleStringProperty nameProperty() { 
     return name; 
    } 

    public final String getName() { return nameProperty().get();} 
    public final void setName(String newName) { nameProperty().set(newName);} 

    public Item(String name) { 
     setName(name); 
    } 
} 
関連する問題