2017-03-03 73 views
0

我對Java編程還很陌生,並且在理解一些概念時非常困難 - 特別是設置TableColumn單元格值。 (如果任何人都可以解釋這通俗地說,那簡直是真棒!)JavaFX在表列單元格中設置顏色或圖標如果

這裏是我的問題...

我有,我有ObservableList加載從我的數據表來在德比的tableview數據庫。將數據添加到表格中的for循環是我從在線觀看中學到的東西,它確實對我有用。我想更進一步,所以這裏是我的挑戰...

ObservalbleList將有類似的例子:第1行[玩具,高等]第2行[框,中等]等..現在,我希望代碼查看這個列表,看看是否在該行 - 獲取第一個值,如果該值等於高,中或低,然後在我將分配的狀態列中添加一個顏色圖標(或者如果圖標爲顏色填充工作太多)Example。這是我的代碼,如果該顏色圖標片段也會在for循環中,它可能會有意義。我試圖實現的這個功能與Excel中的條件格式相同。

data = FXCollections.observableArrayList(); 

while (rs.next()) { 

    ObservableList<String> row = FXCollections.observableArrayList(); 

    for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++) { 
     row.add(rs.getString(i));    
    } 

    data.add(row); 
    data.add(row); 

    if (data.get(2).equals("High")) { 
     //***set cell icon red or color fill red with padding around*** 
    }    
} 

mtable.setItems(data); 

任何幫助表示讚賞!謝謝!

回答

0

對於TableColumn值的設置,我不會解釋它,因爲它已經被回答過了,再加上你沒有問這個問題。您可以在How to set value to cell in TableView in javafx以及Google搜索中找到更多信息。我搜索了「javafx set tablecolumn value」

您應該有一個合適的數據模型Class,它具有適合您的數據集的方法,您可以從數據庫中獲取該數據集。我不知道你的數據庫裏有什麼,所以我只是使用你在圖片中發佈的內容,即Item Name,Priority,Status

您當然可以將Circle添加到您的TableView,但應該在您的數據模型Class中適當聲明。

有些事情你還需要我沒有提供:

  • 你需要分析你的數據庫的回報,並進行相應的數據構造函數調用。我會讓你知道的。

好吧,現在我正在提供什麼和我做了什麼來實現它。

您將需要使用您的數據模型Class來存儲您的數據庫返回信息,這就是爲什麼它的重要性在於使其設置正確。因此,對於您在返還時關心的每個數據點,應該有適當的setget方法。

在您的返回數據循環中,您需要創建一個new DataModel(x, y, z, ...);並將其添加到ObservableList<DataModel>

這裏是示範基地穿上你的圖片提供:

主。java的

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     TableView<Data> dataTable = new TableView<>(); 
     TableColumn<Data, String> itemName = new TableColumn<>("Item Name"); 
     itemName.setCellValueFactory(cell -> new SimpleStringProperty(cell.getValue().getName())); 
     TableColumn<Data, String> priority = new TableColumn<>("Priority"); 
     priority.setCellValueFactory(cell -> new SimpleStringProperty(cell.getValue().getPriority())); 
     TableColumn<Data, Circle> status = new TableColumn<>("Status"); 
     status.setCellValueFactory(cell -> new SimpleObjectProperty<>(cell.getValue().getStatus())); 

     dataTable.getColumns().addAll(itemName, priority, status); 
     ObservableList<Data> data = FXCollections.observableArrayList(); 

     Data high = new Data("toy", "high"); 
     Data medium = new Data("box", "medium"); 
     Data low = new Data("candy", "low"); 
     data.addAll(high, medium, low); 

     dataTable.setItems(data); 
     Scene scene = new Scene(dataTable, 500, 500); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Data.java(這是我的數據模型)

public class Data { 
    private String name; 
    private String priority; 
    private Circle status; 

    public Data (String name, String priority){ 
     setName(name); 
     setPriority(priority); 
     setStatus(priority); 
    } 

    public String getName(){ 
     return name; 
    } 
    public void setName(String name){ 
     this.name = name; 
    } 

    public String getPriority(){ 
     return priority; 
    } 
    public void setPriority(String priority){ 
     this.priority = priority; 
    } 

    public Circle getStatus(){ 
     return status; 
    } 
    public void setStatus(String priority){ 
     Circle c = new Circle(5); 
     switch(priority){ 
      case "high": 
       c.setFill(Color.GREEN); 
       break; 
      case "medium": 
       c.setFill(Color.YELLOW); 
       break; 
      case "low": 
       c.setFill(Color.RED); 
       break; 
      default: 
     } 
     status = c; 
    } 
} 

正如你所看到的,我沒有提供在Constructorstatus,而是我用Priority來確定它。

希望這會有所幫助。

+0

我增加了更多的內容 - 如果你不介意看看 @HypnicJerk – jerry