2014-08-27 63 views
1

我在使用JavaFX在TableView中刪除數據時遇到了一些問題。 TabeView從一個靜態的ObservableList中接收它的數據。JavaFX TableView刪除問題

問題:TableView一次顯示6行。當有在我ObservableList例如6個數據對象和我刪除它們的1,TableView中似乎有一些更新的問題:

Error

正如你可以看到,紅色突出顯示的行似乎是我的ObservableList中的 中仍然存在的值的副本。您無法選擇此行,因爲ObservableList中當然不存在 值。這種行爲一直刪除一些值之後出現:

enter link description here

所有亮點「行」是不可選擇的原因在我ObservableList沒有相應的值。只有在刪除TableView中的最後一個值/行後,它纔會刷新並變爲空。

我ObservableList IST靜態

public static ObservableList<ImageData> datas_all; 

缺失是非常簡單的

@FXML 
private TableView<ImageData> imageTable; 

... 

@FXML 
private void handleDeleteImage() 
{ 
    ImageData img_data = imageTable.getSelectionModel().getSelectedItem(); 
    Main.datas_all.remove(img_data); 

    //if(Main.datas_flickr.contains(img_data)) 
    // Main.datas_flickr.remove(img_data); 

    //Main.db_adapter.deleteImage(new Integer[]{img_data.getKey()}); 

    //File del_file = new File(img_data.getPath()); 
    //del_file.delete(); 
} 

TableView中包括由

@FXML 
private TableColumn<ImageData,Image> columnImage; 
@FXML 
private TableColumn<ImageData,String> columnName; 

... 

public void redefineTableView() 
{ 
    columnImage.setCellFactory(new Callback<TableColumn<ImageData, Image>, TableCell<ImageData, Image>>() 
    { 
     @Override 
     public TableCell<ImageData, Image> call(TableColumn<ImageData, Image> param) 
     { 
      final ImageView imgView = new ImageView(); 
      imgView.setFitHeight(100); 
      imgView.setFitWidth(100); 

      TableCell<ImageData, Image> cell = new TableCell<ImageData, Image>() 
      { 
       public void updateItem(Image image, boolean empty) 
       { 
        if(image != null) 
         imgView.setImage(image); 
       } 
      }; 
      cell.setGraphic(imgView); 
      return cell; 
     } 
    }); 

    columnName.setCellFactory(new Callback<TableColumn<ImageData, String>, TableCell<ImageData, String>>() 
    { 
     @Override 
     public TableCell<ImageData, String> call(TableColumn<ImageData, String> param) 
     { 
      TableCell<ImageData, String> cell = new TableCell<ImageData, String>() 
      { 
       private Text text; 

       public void updateItem(String string, boolean empty) 
       { 
        super.updateItem(string, empty); 

        if (!isEmpty()) 
        { 
         text = new Text(string); 
         text.setWrappingWidth(170); 
         setGraphic(text); 
        } 
       } 
      }; 

      return cell; 
     } 
    }); 

    columnName.setCellValueFactory(new PropertyValueFactory<ImageData, String>("name")); 
    columnImage.setCellValueFactory(new PropertyValueFactory<ImageData, Image>("image")); 

    imageTable.setItems(Main.datas_all); 
} 

定義的兩排的我GOOGLE了這個問題,但其他人似乎擁有它。 請幫幫我! =)

回答

3

這已被問過,但我現在找不到。問題是您的updateItem(...)方法無法正確處理圖像爲空(或單元格爲空)的情況。當您從表格中刪除一個項目時,情況就是如此。您需要:

 TableCell<ImageData, Image> cell = new TableCell<ImageData, Image>() 
     { 
      public void updateItem(Image image, boolean empty) 
      { 
       if(image == null) { 
        setGraphic(null); 
       } else { 
        imgView.setImage(image); 
        setGraphic(image); 
       } 
      } 
     }; 
     // cell.setGraphic(imgView); 
     return cell; 

和其他細胞工廠類似。

+0

謝謝老兄。現在很明顯:D。順便說一句,它可能是「其他{imgView.setImage(圖像); setGraphic(imageView);}」並在列columnName中做同樣的事情。 =) – 2014-08-27 16:56:57