2014-11-18 5 views
0

다음 코드를 사용하여 Table의 텍스트를 강조 표시하고 HBoxes에 복수 Labels이 포함 된 텍스트를 강조 표시하고 있습니다. 그러나 일부 Labels은 텍스트 대신 타원을 표시합니다. Labels을 전폭으로 표시하려면 어떻게해야합니까?JavaFX 테이블 : 레이블이 예상대로 작동하지 않습니다.

col3.setCellValueFactory(new PropertyValueFactory<RegexMatch, String>("excerptLineTable")); 
    col3.setCellFactory(new Callback<TableColumn, TableCell>() { 
     @Override 
     public TableCell call(TableColumn param) { 
      TableCell cell = new TableCell() { 
       @Override 
       protected void updateItem(Object text, boolean empty) { 
        if (text != null && text instanceof String) { 
         HBox hbox = new HBox(); 
         hbox.setAlignment(Pos.CENTER_LEFT); 
         String str = (String) text; 
         if (txtSearchField.getText().length() > 3 && str.contains(HIGHLIGHT_START)) { 
          // Something to highlight 
          hbox.getChildren().clear(); 
          while (str.contains(HIGHLIGHT_START)) { 
           // First part 
           Label label = new Label(str.substring(0, str.indexOf(HIGHLIGHT_START))); 
           label.setWrapText(false); 
           label.setMaxWidth(Double.MAX_VALUE); 
           hbox.getChildren().add(label); 
           str = str.substring(str.indexOf(HIGHLIGHT_START) + HIGHLIGHT_START.length(), str.length()); 
           // Part to highlight 
           Label label2 = new Label(str.substring(0, str.indexOf(HIGHLIGHT_END))); 
           label2.setWrapText(false); 
           label2.setMaxWidth(Double.MAX_VALUE); 
           label2.setStyle("-fx-background-color: "+ HIGHLIGHT_COLOR+";"); 
           hbox.getChildren().add(label2); 
           // Last part 
           str = str.substring(str.indexOf(HIGHLIGHT_END) + HIGHLIGHT_END.length(), str.length()); 
           if (!str.contains(HIGHLIGHT_START)) { 
            Label label3 = new Label(str); 
            label3.setWrapText(false); 
            label3.setMaxWidth(Double.MAX_VALUE); 
            hbox.getChildren().add(label3); 
           } 
          } 
         } else if (txtSearchField.getText().length() < 1) { 
          // Remove former highlightings and show simple text 
          str = str.replaceAll(HIGHLIGHT_START, ""); 
          str = str.replaceAll(HIGHLIGHT_END, ""); 
          hbox.getChildren().clear(); 
          Label label = new Label(str); 
          label.setWrapText(false); 
          label.setMaxWidth(Double.MAX_VALUE); 
          hbox.getChildren().add(label); 
         } else { 
          // show simple text 
          hbox.getChildren().clear(); 
          Label label = new Label(str); 
          label.setWrapText(false); 
          label.setMaxWidth(Double.MAX_VALUE); 
          hbox.getChildren().add(label); 
         } 
         setGraphic(hbox); 
        } 
       } 
      }; 
      return cell; 
     } 
    }); 

enter image description here

솔루션
TableView에 대해 서로 다른 배경 색상으로 HBoxLabels을 사용하여 잘 작동합니다. 내 문제는 강조 표시 검색 및 바꾸기 방법의 버그였습니다.

private static Label createNoEllipsisLabel(String pText) 
{ 
    Label label = new Label(pText); 
    double width = computeTextWidth(label.getFont(), pText, 0); 
    label.setPrefWidth(width); 
    label.setMinWidth(width); 
    return label; 
} 

private static final TextLayout layout = Toolkit.getToolkit().getTextLayoutFactory().createLayout(); 

private static double computeTextWidth(Font font, String text, double wrappingWidth) { 
    layout.setContent(text != null ? text : "", font.impl_getNativeFont()); 
    layout.setWrapWidth((float)wrappingWidth); 
    return layout.getBounds().getWidth(); 
} 

com.sun.javafx.scene.control.skin.Utils.computeTextWidth(Font, String, double)에서 복사되기 때문에 오히려 좋은 생각이 아니다 매우 내부 API를 사용 :

답변

1

나는 단지 오히려 추한 솔루션을 발견했다.

누군가 다른 사람이 더 나은 해결책을 찾았습니까?

+0

동작이 이상하게 보입니다. 버그입니까, 아니면 원하는 동작입니까? – alex

+0

불행히도 귀하의 솔루션이 나를 위해 작동하지 않습니다, 레이블은 elipsis와 함께있어 ... – alex

+0

나는 TableView 내부에서 그것을 테스트하지 않았고 그것이 어디에 문제라고 생각합니다 : 각 테이블 셀은 크기를 조정할 수 있어야하며 열보다 더 커질 수 없습니다. FlowPane을 사용하는 것이 더 나은 옵션이라고 생각합니다. 라벨이 셀 너비를 초과하면 라벨이 여러 줄로 나뉩니다. 그러나 이것으로 인해 레이블은 필요한 공간을 확보 할 수 있습니다. – eckig

관련 문제