2013-08-23 2 views
0

이것은 내 fxml 양식의 코드 mainController입니다. tableview 작업의 이미지이지만 일부 이상합니다.
첫 행 추가 - 확인.
두 번째 추가 : 처음부터 두 번째, 마지막에서 첫 번째 이미지를 봅니다.
세 번째 추가 : 시작부터 세 번째 줄 끝에서부터 네 번째보기 ...
이것은 무엇입니까? 데이터는 해당 행에 추가되지 않지만 이미지는 추가됩니다. 문제가 어디에 있습니까?tableview의 이미지 뷰. JavaFX. 무슨 뜻인지 설명하지 않습니까?

package cardiler; 

import java.io.IOException; 
import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.scene.control.ContentDisplay; 
import javafx.scene.control.Label; 
import javafx.scene.control.TableCell; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 
import javafx.util.Callback; 
import viewpages.AddFilterWindowController; 


public class MainWindowController { 

    @FXML 
    private ResourceBundle resources; 

    @FXML 
    private URL location; 

    // Фильтры ------------------------------------------------ // 
    @FXML 
    private TableView<CarFilters> filtersTable; 
    @FXML 
    private TableColumn<CarFilters, String> firmColumn;  
    @FXML 
    private TableColumn<CarFilters, String> modelColumn; 

    private ObservableList<CarFilters> filtersData = FXCollections.observableArrayList(); 

    // Результаты поиска -------------------------------------- // 
    @FXML 
    private TableView<CarResult> scanResultsTable; 
    @FXML 
    private TableColumn<CarResult, String> firmRTColumn; 
    @FXML 
    private TableColumn<CarResult, String> modelRTColumn; 
    @FXML 
    private TableColumn<CarResult, CarPhoto> photoRTColumn; 

    private ObservableList<CarResult> resultsData = FXCollections.observableArrayList(); 


    @FXML 
    void handleAddFilterButton(ActionEvent event) { 
     try { 
      // Load the fxml file and create a new stage for the popup 
      FXMLLoader loader = new FXMLLoader(CarDiler.class.getResource("/viewpages/AddFilterWindow.fxml")); 
      AnchorPane page = (AnchorPane) loader.load(); 
      Stage dialogStage = new Stage(); 
      dialogStage.setTitle("Edit Person"); 
      dialogStage.initModality(Modality.WINDOW_MODAL); 
//   dialogStage.initOwner(primaryStage); 
      Scene scene = new Scene(page); 
      dialogStage.setScene(scene); 

      // Set the person into the controller 
      AddFilterWindowController controller = loader.getController(); 
      controller.setDialogStage(dialogStage); 
      CarFilters carFilter = new CarFilters(); 
      controller.setCarFilterLink(carFilter); 

      // Show the dialog and wait until the user closes it 
      dialogStage.showAndWait(); 

      if (controller.isOkClicked()) 
      { 
       filtersData.add(carFilter); 
      } 
//   return controller.isOkClicked(); 

      } catch (IOException e) { 
      // Exception gets thrown if the fxml file could not be loaded 
      e.printStackTrace(); 
//   return false; 
      } 
    } 

    @FXML 
    void handleSearchBuyers(ActionEvent event) { 
    } 

    @FXML 
    void handleSearchSellers(ActionEvent event) { 
    } 

    @FXML 
    void handleStartButton(MouseEvent event) { 
     resultsData.add(new CarResult("ddd", "sss", new CarPhoto("ss", "dd", "/resources/images/start_button.png"))); 
     scanResultsTable.setItems(resultsData); 
    } 

    @FXML 
    void initialize() { 
     // Результат --------------------------------------------------------------------- // 
     assert scanResultsTable != null : "fx:id=\"scanResultsTable\" was not injected: check your FXML file 'MainWindow.fxml'."; 

     firmRTColumn.setCellValueFactory(new PropertyValueFactory<CarResult, String>("firm")); 
     modelRTColumn.setCellValueFactory(new PropertyValueFactory<CarResult, String>("model")); 
     photoRTColumn.setCellValueFactory(new PropertyValueFactory<CarResult, CarPhoto>("photo")); 
     // SETTING THE CELL FACTORY FOR THE ALBUM ART     
     photoRTColumn.setCellFactory(new Callback<TableColumn<CarResult,CarPhoto>, 
       TableCell<CarResult,CarPhoto>>(){   
       @Override 
       public TableCell<CarResult, CarPhoto> call(TableColumn<CarResult, CarPhoto> param) {     
         return new TableCell<CarResult, CarPhoto>(){ 
           ImageView imageview; 
           { 
            imageview = new ImageView(); 
            imageview.setFitHeight(20); 
            imageview.setFitWidth(20); 
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
            setGraphic(imageview); 
           } 

           @Override 
           public void updateItem(CarPhoto item, boolean empty) { 
            super.updateItem(item, empty); 
             if(!empty && !item.equals(null)){ 
              imageview.setImage(new Image(item.getPhoto())); 
             } 
             System.out.println(item); 
           } 

         }; 

       } 
     }); 
     scanResultsTable.setItems(resultsData); 

     // Филтры ------------------------------------------------------------------------ // 
     assert filtersTable != null : "fx:id=\"filtersTable\" was not injected: check your FXML file 'MainWindow.fxml'."; 
     // Маппинг колонок с полями класса потомка 
     firmColumn.setCellValueFactory(new PropertyValueFactory<CarFilters, String>("firm")); 
     modelColumn.setCellValueFactory(new PropertyValueFactory<CarFilters, String>("model")); 
     filtersTable.setItems(filtersData); 
    } 

} 

답변

1

tableview 및 listview 셀은 소스 목록의 다른 행 데이터를 렌더링하기 위해 다시 사용됩니다. 귀하의 문제는 아마 세포 항목의 업데이 트에 놓여 있습니다. 사용해보기 :

@Override 
public void updateItem(CarPhoto item, boolean empty) { 
    super.updateItem(item, empty); 
    if (!empty && !item.equals(null)) { 
     imageview.setImage(new Image(item.getPhoto())); 
    } 
    else { 
     imageview.setImage(null); 
    } 
    System.out.println(item); 
} 
관련 문제