2016-06-21 5 views
-1

文字列をハイパーリンクとして表示するようにTextFieldTreeTableCellのレンダリングを変更しようとしています。 setSkinなどを使ってやりとりする必要があるようですが、JavaFXでTreeTableCellレンダリングをオーバーライドします

setSkin((新しいHyperLink())。getSkin());

又は

setSkin((新しいハイパーリンク(のgetItem()))getSkin()。)。

は役に立ちません。どのようにこれを行うことができるかについての洞察はありますか?

+0

私は編集不可能なクリック可能なURLを表示したいと思います。 – user3277488

答えて

0

あなたは間違っ

  1. をやっているあなたは、あなたのセルをカスタマイズするには、右の機能を使用していない:setSkinは、カスタムコントロールのスキンを作成するために使用し、コントロールだけではなく、細胞のすべての種類に一般的ですが、代わりにセルファクトリを使用する必要があります。
  2. 右のスーパークラスを使用していません:TextFieldTreeTableCellは、編集可能なTextFieldをクリックすると作成可能なラベルを含むセルを作成するためのものです。このような機能は、「編集不可能なクリック可能なURLを表示する」場合には役に立ちません。あなたは

    細胞を使用する必要があります

アプローチは、細胞を扱うとき皮膚機構に好まれる彼らのレンダリングを制御するための具体的な方法があります。このセル固有のメカニズムは、セルファクトリと呼ばれ、Cell documentationに例が記載されています。

TreeTableColumnsを入力すると、列のセルのレンダリングを制御するために、列にset a cell factoryを割り当てることができます。セルにハイパーリンクをレンダリングするための関連するコードは以下の通りです:、ユーザーがちょうど[email protected]のハイパーリンクにリンクされた以下のスクリーンショットで

emailColumn.setCellFactory(param -> new TreeTableCell<Employee, String>() { 
    private Hyperlink link = new Hyperlink(); 
    { 
     setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
    } 

    @Override 
    protected void updateItem(String item, boolean empty) { 
     super.updateItem(item, empty); 

     if (item == null || empty) { 
      setGraphic(null); 
      return; 
     } 

     link.setText(item); 
     link.setVisited(getTreeTableRow().getItem().isVisited()); 
     link.setOnAction(event -> { 
      getTreeTableRow().getItem().setVisited(true); 
      sendLabel.setText("Send mail to: " + item); 
     }); 
     setGraphic(link); 
    } 
}); 

サンプルアプリケーション

sample view

サンプルコードはOracle TreeTableView tutorialからコードの修正版です。 TreeTableView内のどのアイテムがクリックされたかを追跡するために、訪問されたプロパティをEmployeeクラスに追加する必要があり、セルが更新されたときにハイパーリンクvisitedプロパティを適切に設定できます。

import javafx.application.Application; 
import javafx.beans.property.*; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.image.*; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

import java.util.*; 

public class TreeTableViewSample extends Application { 

    private List<Employee> employees = Arrays.asList(
     new Employee("Ethan Williams", "[email protected]"), 
     new Employee("Emma Jones", "[email protected]"), 
     new Employee("Michael Brown", "[email protected]"), 
     new Employee("Anna Black", "[email protected]"), 
     new Employee("Rodger York", "[email protected]"), 
     new Employee("Susan Collins", "[email protected]")); 

    private final ImageView depIcon = new ImageView (
      new Image("http://icons.iconarchive.com/icons/custom-icon-design/flatastic-10/16/Bear-icon.png") 
    ); 

    final TreeItem<Employee> root = 
     new TreeItem<>(new Employee("Sales Department", ""), depIcon); 
    public static void main(String[] args) { 
     Application.launch(TreeTableViewSample.class, args); 
    } 

    final Label sendLabel = new Label(); 

    @Override 
    public void start(Stage stage) { 
     root.setExpanded(true); 
     employees.forEach((employee) -> root.getChildren().add(new TreeItem<>(employee))); 
     stage.setTitle("Tree Table View Sample"); 
     final Scene scene = new Scene(new VBox(), 400, 400); 
     scene.setFill(Color.LIGHTGRAY); 
     VBox sceneRoot = (VBox) scene.getRoot(); 

     TreeTableColumn<Employee, String> empColumn = 
      new TreeTableColumn<>("Employee"); 
     empColumn.setPrefWidth(150); 
     empColumn.setCellValueFactory(
      (TreeTableColumn.CellDataFeatures<Employee, String> param) -> 
      new ReadOnlyStringWrapper(param.getValue().getValue().getName()) 
     ); 

     TreeTableColumn<Employee, String> emailColumn = 
      new TreeTableColumn<>("Email"); 
     emailColumn.setPrefWidth(190); 
     emailColumn.setCellValueFactory(
      (TreeTableColumn.CellDataFeatures<Employee, String> param) -> 
      new ReadOnlyStringWrapper(param.getValue().getValue().getEmail()) 
     ); 
     emailColumn.setCellFactory(param -> new TreeTableCell<Employee, String>() { 
      private Hyperlink link = new Hyperlink(); 
      { 
       setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
      } 

      @Override 
      protected void updateItem(String item, boolean empty) { 
       super.updateItem(item, empty); 

       if (item == null || empty) { 
        setGraphic(null); 
        return; 
       } 

       link.setText(item); 
       link.setVisited(getTreeTableRow().getItem().isVisited()); 
       link.setOnAction(event -> { 
        getTreeTableRow().getItem().setVisited(true); 
        sendLabel.setText("Send mail to: " + item); 
       }); 
       setGraphic(link); 
      } 
     }); 

     TreeTableView<Employee> treeTableView = new TreeTableView<>(root); 
     treeTableView.getColumns().setAll(empColumn, emailColumn); 
     sceneRoot.getChildren().addAll(treeTableView, sendLabel); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public class Employee { 
     private SimpleStringProperty name; 
     private SimpleStringProperty email; 
     private SimpleBooleanProperty visited; 

     public SimpleStringProperty nameProperty() { 
      if (name == null) { 
       name = new SimpleStringProperty(this, "name"); 
      } 
      return name; 
     } 
     public SimpleStringProperty emailProperty() { 
      if (email == null) { 
       email = new SimpleStringProperty(this, "email"); 
      } 
      return email; 
     } 
     private Employee(String name, String email) { 
      this.name = new SimpleStringProperty(name); 
      this.email = new SimpleStringProperty(email); 
      this.visited = new SimpleBooleanProperty(false); 
     } 
     public String getName() { 
      return name.get(); 
     } 
     public void setName(String fName) { 
      name.set(fName); 
     } 
     public String getEmail() { 
      return email.get(); 
     } 
     public void setEmail(String fName) { 
      email.set(fName); 
     } 

     public void setVisited(boolean visited) { 
      this.visited.set(visited); 
     } 

     public boolean isVisited() { 
      return visited.get(); 
     } 
    } 
} 
+0

ああ、私は今参照してください!ありがとう:) – user3277488

関連する問題