2016-06-21 5 views
-1

Ich versuche, das Rendern einer TextFieldTreeTableCell zu ändern, um eine Zeichenfolge als ein Hyperlink im Gegensatz zu Klartext, ohne Erfolg anzuzeigen. Es scheint so, als ob es mit setSkin machbar wäre, aber so etwas wieOverride TreeTableCell Rendering in JavaFX

setSkin ((new HyperLink()). GetSkin());

oder

setSkin ((new HyperLink (getItem())) getSkin().);

hilft nicht. Irgendwelche Erkenntnisse darüber, wie das gemacht werden könnte?

+0

Ich möchte eine nicht bearbeitbare, anklickbare URL anzeigen. – user3277488

Antwort

0

Was machst du falsch

  1. Sie sind nicht die richtige Funktion mit Ihrer Zelle anpassen: setSkin wird zum Erstellen von benutzerdefinierten Steuer Fellen verwendet wird und allgemein für alle Arten von Kontrollen nicht nur Zellen, Sie sollten stattdessen eine Zellfabrik verwenden.
  2. Sie verwenden nicht die richtige Oberklasse: TextFieldTreeTableCell dient zum Erstellen einer Zelle, die eine Beschriftung enthält, die zu einem bearbeitbaren TextField werden kann, wenn Sie darauf klicken. Diese Funktionalität ist nicht nützlich, wenn Sie eine nicht bearbeitbare, anklickbare URL anzeigen möchten.

Ansatz Sie

Zellen hat ein spezifisches Verfahren für ihren Rendering steuern, die auf die Haut Mechanismus bevorzugt, wenn mit Zellen arbeiten verwenden sollen. Dieser zellspezifische Mechanismus wird als Zellfabrik bezeichnet und ist mit einem Beispiel in der Cell documentation dokumentiert.

TreeTableColumns können Sie set a cell factory auf der Spalte, um das Rendering der Spalte Zellen zu steuern. Der entsprechende Code, um einen Hyperlink in einer Zelle für die Darstellung unter:

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); 
    } 
}); 

Beispielanwendung

Im Screenshot unten hat der Benutzer nur für [email protected] auf den Hyperlink verknüpft.

sample view

Der Beispielcode ist eine modifizierte Version des Codes aus dem Oracle TreeTableView tutorial. Das Hinzufügen einer besuchten Eigenschaft zur Employee-Klasse ist erforderlich, um zu verfolgen, auf welche Elemente in der TreeTableView geklickt wurde, sodass die Hyperlink visited -Eigenschaft bei der Aktualisierung der Zelle entsprechend festgelegt werden kann.

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

Ah, ich sehe jetzt! Vielen Dank :) – user3277488