2016-06-21 2 views
-1

문자열을 하이픈 링크로 일반 텍스트와 반대로 표시하도록 TextFieldTreeTableCell의 렌더링을 변경하려고합니다. 그것은 마치 setSkin을 사용하여 수행 할 수있는 것처럼 보이지만,JavaFX의 TreeTableCell 렌더링을 재정의하십시오.

setSkin ((새로운 HyperLink()). getSkin());

또는

setSkin ((새 하이퍼 링크 (의 getItem())) getSkin().);

도움이되지 않습니다. 이것이 어떻게 수행 될 수 있는지에 대한 통찰력?

+0

편집 할 수없는 클릭 가능한 URL을 표시하고 싶습니다. – user3277488

답변

0

당신이하고있는

  • 당신은 당신의 세포 사용자 정의 할 수있는 권한 기능을 사용하지 않을

      잘못된 : setSkin 사용자 지정 컨트롤 스킨을 만드는 데 사용됩니다 및 제어뿐만 아니라 세포의 모든 종류 일반적이다, 대신에 셀 팩터 리를 사용해야합니다.
    1. 오른쪽 수퍼 클래스를 사용하고 있지 않습니다. 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에서 코드의 수정 된 버전이다. Employee 클래스에 visited 속성을 추가하면 클릭 한 TreeTableView 항목을 추적하여 셀이 업데이트 될 때 하이퍼 링크 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

    관련 문제