2012-12-04 56 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

我还有一个问题:我可以同样突出显示行中的单个单元吗? –