2016-11-21 77 views
0

有沒有機會在選定的行上對TableView行顏色進行編碼?我的意思是這樣的:例如我有TableView充滿電影,我想要一個特定的電影(行)在點擊時改變顏色 - 當它在商店時變成綠色 - 或 - 變紅 - 當它不在商店時。通過查詢數據庫來實現簡單的功能,我們會知道它是否在商店中,但是我也需要一些能夠改變所選行背景顏色的功能。有沒有什麼辦法可以讓代碼類似的東西?點擊行背景顏色JavaFX

+0

https://docs.oracle.com/javase/8/javafx /api/javafx/scene/control/TableCell.html – Mordechai

回答

1

你可以做線沿線的東西:

TableView<Movie> table = ... ; 

PseudoClass outOfStockPseudoClass = PseudoClass.getPseudoClass("out-of-stock"); 

table.setRowFactory(tv -> { 
    TableRow<Movie> row = new TableRow<>(); 
    row.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> { 
     if (isNowSelected) { 
      boolean outOfStock = checkIfOutOfStock(row.getItem()) ; 
      row.pseudoClassStateChanged(outOfStockPseudoClass, outOfStock); 
     } 
    }); 
    row.itemProperty().addListener((obs, oldMovie, newMovie) -> { 
     if (row.isSelected()) { 
      boolean outOfStock = checkIfOutOfStock(newMovie) ; 
      row.pseudoClassStateChanged(outOfStockPseudoClass, outOfStock); 
     } 
    }); 
    return row ; 
}); 

,然後在外部CSS文件就

.table-row-cell { 
    -fx-selection-bar: /* color for in-stock selected row */ ; 
} 
.table-row-cell:out-of-stock { 
    -fx-selection-bar: /* color for out-of-stock selected row */; 
} 

如果你可以檢查電影是否是庫存在初始化時來自數據庫的數據,可以簡化您的排廠:

table.setRowFactory(tv -> new TableRow<Movie>() { 
    @Override 
    protected void updateItem(Movie item, boolean empty) { 
     super.updateItem(item, empty); 
     pseudoClassStateChanged(outOfStockPseudoClass, 
      item!=null && item.isOutOfStock()); 
    } 
}); 
+0

嗯這可能工作,但顏色不chaning:/外部CSS文件是標準的application.css?我必須將它鏈接到應用程序才能工作嗎?我的意思是,我可以以某種方式沒有僞類,就像這裏:http://stackoverflow.com/questions/30889732/javafx-tableview-change-row-color-based-on-column-value和是的,在tableview初始化或刷新我不會讓查詢檢查,如果該電影是在股票或沒有? –