2012-12-04 58 views
14

我需要用多色行創建JavaFx TableView(color1爲低優先級,color2爲中等優先級等)。我創建CellFactoryJavaFX桌面顏色

public class TaskCellFactory implements Callback<TableColumn, TableCell> { 

@Override 
public TableCell call(TableColumn p) { 

    TableCell cell = new TableCell<Task, Object>() { 
     @Override 
     public void updateItem(Object item, boolean empty) { 
      super.updateItem(item, empty); 
      setText(empty ? null : getString()); 
      setGraphic(null); 
      TableRow currentRow = getTableRow(); 
      Task currentTask = currentRow == null ? null : (Task)currentRow.getItem(); 
      if(currentTask != null){ 
       Priority priority = currentTask.getPriority(); 
       clearPriorityStyle(); 
       if(!isHover() && !isSelected() && !isFocused()){ 
        setPriorityStyle(priority); 
       } 
      } 
     } 

     @Override 
     public void updateSelected(boolean upd){ 
      super.updateSelected(upd); 
      System.out.println("is update"); 
     } 

     private void clearPriorityStyle(){ 
      ObservableList<String> styleClasses = getStyleClass(); 
      styleClasses.remove("priorityLow"); 
      styleClasses.remove("priorityMedium"); 
      styleClasses.remove("priorityHigh"); 
     } 

     private void setPriorityStyle(Priority priority){ 
      switch(priority){ 
       case LOW: 
        getStyleClass().add("priorityLow"); 
        break; 
       case MEDIUM: 
        getStyleClass().add("priorityMedium"); 
        break; 
       case HIGH: 
        getStyleClass().add("priorityHigh"); 
        break; 
      } 
      System.out.println(getStyleClass()); 
     } 

     private String getString() { 
      return getItem() == null ? "" : getItem().toString(); 
     } 
    }; 
    return cell; 
} } 

和CSS

.priorityLow{ -fx-background-color: palegreen; } 
.priorityMedium{ -fx-background-color: skyblue;} 
.priorityHigh{ -fx-background-color: palevioletred;} 

但我仍然需要突出所選行。我怎樣才能做到這一點?

回答

17

而不是設置CSS中整個單元格的背景顏色,只需設置-fx-control-inner-background。然後您將擁有默認口音,懸停和對焦環仍然可用。當然也可以去掉你的setPriorityStyle調用的if語句。

如果你還想重寫像默認口音(選定)顏色或懸停顏色的東西,你也可以做到這一點在CSS下面 - 不知道是否真的推薦突出顯示覆蓋,猜猜它會取決於在您的應用程序和所需的用戶體驗。

.priorityLow { 
    -fx-control-inner-background: palegreen; 
    -fx-accent: derive(-fx-control-inner-background, -40%); 
    -fx-cell-hover-color: derive(-fx-control-inner-background, -20%); 
} 

.priorityMedium { 
    -fx-control-inner-background: skyblue; 
    -fx-accent: derive(-fx-control-inner-background, -40%); 
    -fx-cell-hover-color: derive(-fx-control-inner-background, -20%); 
} 

.priorityHigh { 
    -fx-control-inner-background: palevioletred; 
    -fx-accent: derive(-fx-control-inner-background, -40%); 
    -fx-cell-hover-color: derive(-fx-control-inner-background, -20%); 
} 

rowhighlight


JavaFX的詳細樣式信息可以在默認caspian.css stylesheet找到JavaFX的2.2和JavaFX 2 CSS reference guide。要找到您的JavaFX版本的caspian.css,您可以打開jfxrt.jar(有時可以在jre/lib目錄中找到)。

+1

謝謝你))你能回答,我在哪裏可以找到這些css屬性列表(如-fx-control-inner-background,-fx-accent)或一些樣本? –

+0

更新後的答案指向這些資源。 – jewelsea

+0

我還有一個問題:我可以同樣突出顯示行中的單個單元嗎? –