2017-01-07 18 views
0

JavaFX로 테이블을 만들고 있습니다. 모든 행에는 텍스트가 있습니다. 한 행에는 그 셀의 텍스트에 여러 색상이 있기 때문에 그래픽이 있습니다.JavaFX - 다른 행보다 높은 TableColumn 그래픽

departTimeCol.setCellFactory(column -> new TableCell<Ride, String>() { 
      @Override 
      protected void updateItem(String item, boolean empty) { 
       super.updateItem(item, empty); 

       setText(item); 

       if(item != null && ! empty){ 
        if(item.matches("^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]\\s\\+[\\d]")) { 
         Text timeText = new Text(item.split(" ")[0].trim() + " "); 
         Text delayText = new Text(item.split(" ")[1].trim()); 

         delayText.setFill(Color.RED); 

         TextFlow flow = new TextFlow(timeText, delayText); 

         setText(null); 
         setGraphic(flow); 

        } 
       } 
      } 
     }); 

결과는 다음과 같습니다 :

Result

빨간색이 가진 행이 그래픽입니다 특정 조건 (일부 작품)에 해당하는 경우

코드에만 적용 . 다른 모든 행은 텍스트를 포함합니다. 그래픽을 포함하는 행에 동일한 높이를 부여하려면 어떻게합니까?

답변

0

단순히 텍스트를 저장하는 데 필요한 높이를 높이려면 우선 높이를 0으로 설정하십시오.

Pattern pattern = Pattern.compile("((?:[0-9]|[01][0-9]|2[0-3]):[0-5][0-9]\\s)(\\+\\d)"); 

departTimeCol.setCellFactory(column -> new TableCell<Ride, String>() { 

    private final Text timeText = new Text(); 
    private final Text delayText = new Text(); 
    private final TextFlow flow = new TextFlow(timeText, delayText); 

    { 
     delayText.setFill(Color.RED); 
     flow.setPrefHeight(0); 
     flow.heightProperty().addListener((observable, oldValue, newValue) -> { 
      this.setMinHeight(newValue.doubleValue() + 4); 
     }); 
     flow.setMinHeight(Region.USE_COMPUTED_SIZE); 
     setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
     setGraphic(flow); 
    } 

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

     if (empty || item == null) { 
      timeText.setText(""); 
      delayText.setText(""); 
      delayText.setVisible(false); 
     } else { 
      Matcher m = pattern.matcher(item); 
      if (m.matches()) { 
       timeText.setText(m.group(1)); 
       delayText.setText(m.group(2)); 
       delayText.setVisible(true); 
      } else { 
       timeText.setText(item); 
       delayText.setText(""); 
       delayText.setVisible(false); 
      } 
     } 

    } 
}); 

주 수정해야 할 코드의 몇 가지 있다는 것을 다음 String 더 이상 경우 정규식 또는 일치하더라도

  • 당신은 null 다시 그래픽을 설정하지는, 셀이 비게됩니다. 즉, TableCelltext 속성이 비어 있지 않고 graphicTextFlow이 포함 된 상태로 가져올 수 있음을 의미합니다. 참고 :updateItem 메서드가 호출되는 빈도와 관계없이 전달 된 인수와 별도로 셀 모양의 상태가 올바른지 항상 확인하십시오.
  • 한 케이스의 경우 graphic + a TextFlow을 사용하고 다른 케이스의 경우 text 속성을 사용하여 일관성없는 모양을 만듭니다. (스크린 샷에서 텍스트의 가장 왼쪽 부분을 살펴보십시오! 제대로 정렬되지 않았습니다.)
  • Cell을 사용하는 모든 목적은 불필요한 노드 생성을 방지하기 위해 노드를 재사용하고 있습니다. 너 TextFlow 등을 재현하여이 시도를 망칠 수있다. 이러한 노드를 다시 사용하는 대신 updateItem 메서드를 사용하십시오.
  • matches은 이미 전체 입력이 일치하는지 확인하기 때문에 정규 표현식은 ^으로 시작할 필요가 없습니다. 또한 split에 사용 된 구분 기호는 정규식에 정확히 일치하지 않습니다. 탭과 같이 이외의 공백 문자가 있습니다. 그냥 ... 다음 코드는 무엇을 확인

    System.out.println("a\tb".matches(".\\s.")); 
    System.out.println("a\tb".split(" ")[1]); 
    

    또한 입력을 구문 분석하고 Pattern + Matcher를 사용하여 그룹을 캡처하여 동일한 단계에서 일치시킬 수 있습니다. 이렇게하면 위에서 언급 한 문제가 발생하지 않습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 당신의 해결책을 시도했지만, +2는 빨간색이되지 않습니다 :/ – Matthijs

+0

Oh nvm. 내 잘못이야. setPrefHeight 설정이 효과를 발휘했습니다! – Matthijs