2012-12-04 13 views
14

Ho bisogno di creare JavaView TableView con righe multicolore (colore1 per priorità bassa, colore2 per priorità media ecc.). Ho creato CellFactoryColori tabella JavaFX

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; 
} } 

e css

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

ma ho ancora bisogno evidenziare le righe selezionate. Come lo posso fare?

risposta

17

Invece di impostare il colore di sfondo per l'intera cella nel css, basta impostare -fx-control-inner-background. Avrai quindi l'accento predefinito, il passaggio del mouse e gli anelli di messa a fuoco ancora disponibili. Rimuovi anche la dichiarazione if attorno alla tua chiamata setPriorityStyle.

Se si desidera ignorare elementi come il colore dell'accento predefinito (selezionato) o il colore del passaggio del mouse, è anche possibile farlo come nel seguente css: non sono sicuro che le sostituzioni dell'evidenziazione siano davvero consigliate, supponiamo che dipenderà sulla tua app e sull'esperienza utente desiderata.

.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


informazioni dettagliate styling per JavaFX può essere trovato in difetto caspian.css stylesheet per JavaFX 2.2 e il JavaFX 2 CSS reference guide. Per trovare caspian.css per la tua versione di JavaFX è possibile deselezionare jfxrt.jar (a volte trovato nella directory jre/lib).

+1

Grazie)) Puoi rispondere, dove posso trovare l'elenco di queste proprietà css (come -fx-control-inner-background, -fx-accent) o alcuni esempi? –

+0

Risposta aggiornata per puntare a queste risorse. – jewelsea

+0

Ho un'altra domanda: posso evidenziare anche una singola cella in fila? –

Problemi correlati