2012-11-27 9 views
7

Ho il seguente richiamata in ascolto sulla cella selezionata di un TableView:JavaFX, ottenere l'oggetto a cui fa riferimento un TableCell

 Callback<TableColumn<MyFTPFile,String>, TableCell<MyFTPFile,String>> cellFactory = 
      new Callback<TableColumn<MyFTPFile,String>, TableCell<MyFTPFile,String>>() { 
       public TableCell<MyFTPFile,String> call(TableColumn<MyFTPFile,String> p) { 
        TableCell<MyFTPFile,String> cell = new TableCell<MyFTPFile, String>() { 
         @Override 
         public void updateItem(String item, boolean empty) { 
          super.updateItem(item, empty); 
          setText(empty ? null : getString()); 
          setGraphic(null); 
         } 

         private String getString() { 
          return getItem() == null ? "" : getItem().toString(); 
         } 
        }; 

        cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { 
         @Override 
         public void handle(MouseEvent event) { 
          if (event.getClickCount() > 1) { 
           TableCell<MyFTPFile,String> c = (TableCell<MyFTPFile,String>) event.getSource(); 


           ftpObservablelist = MyFTPClient.getInstance().getFtpObservableList(); 
           ftpTable.setItems(ftpObservablelist); 

          } 
         } 
        }); 

Ora, vorrei ottenere l'oggetto MyFTPFile, che fa riferimento alla cella, che è doppio, così posso passarlo ad un'altra classe e fare cose ... Qualche idea come farlo ???

Grazie in anticipo.

risposta

10

L'oggetto MyFTPFile è associato alla riga della cella, quindi, come indicato dal richiedente nel suo commento, è recuperabile tramite cell.getTableRow().getItem().

In un primo momento ho pensato che questo dovrebbe essere cell.getItem(), che restituisce il valore di dati associata alla cella. Tuttavia, il più delle volte, il valore dei dati della cella sarà una proprietà dell'elemento di supporto piuttosto che dell'oggetto stesso (ad esempio un campo nomefile di un oggetto MyFTPFile).

campione eseguibile per i curiosi:.

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.TableCell; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.control.cell.TextFieldTableCell; 
import javafx.scene.input.MouseEvent; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class TableClickListener extends Application { 

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

    class FTPTableCell<S, T> extends TextFieldTableCell<S, T> { 
    FTPTableCell() { 
     super(); 
     addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      if (event.getClickCount() > 1 && getItem() != null) { 
      System.out.println("Sending " + getTableRow().getItem() + " to the FTP client"); 
      } 
     } 
     }); 
    } 
    } 

    final Callback<TableColumn<MyFTPFile, String>, TableCell<MyFTPFile, String>> FTP_TABLE_CELL_FACTORY = 
     new Callback<TableColumn<MyFTPFile, String>, TableCell<MyFTPFile, String>>() { 
     public TableCell<MyFTPFile, String> call(TableColumn<MyFTPFile, String> p) { 
      return new FTPTableCell<>(); 
     } 
     }; 

    @Override 
    public void start(final Stage stage) { 
    final TableView<MyFTPFile> table = new TableView<>(); 

    final TableColumn<MyFTPFile, String> filenameColumn = new TableColumn<>("Filename"); 
    filenameColumn.setCellValueFactory(new PropertyValueFactory<MyFTPFile, String>("filename")); 
    filenameColumn.setCellFactory(FTP_TABLE_CELL_FACTORY); 
    filenameColumn.setMinWidth(150); 

    final TableColumn<MyFTPFile, String> ratingColumn = new TableColumn<>("Rating"); 
    ratingColumn.setCellValueFactory(new PropertyValueFactory<MyFTPFile, String>("rating")); 
    ratingColumn.setCellFactory(FTP_TABLE_CELL_FACTORY); 
    ratingColumn.setMinWidth(20); 

    table.getColumns().setAll(filenameColumn, ratingColumn); 

    table.getItems().setAll(
     new MyFTPFile("xyzzy.txt", 10), 
     new MyFTPFile("management_report.doc", 1), 
     new MyFTPFile("flower.png", 7) 
    ); 

    table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 

    stage.setScene(new Scene(new Group(table))); 
    stage.show(); 
    } 

    public class MyFTPFile { 
    private final String filename; 
    private final int rating; 

    MyFTPFile(String filename, int rating) { 
     this.filename = filename; 
     this.rating = rating; 
    } 

    public String getFilename() { 
     return filename; 
    } 

    public int getRating() { 
     return rating; 
    } 

    @Override 
    public String toString() { 
     return "MyFTPFile{" + 
      "filename='" + filename + '\'' + 
      ", rating=" + rating + 
      '}'; 
    } 
    } 

} 
+2

Thx, ma è cell.getTableRow() getItem(), devo usare, per ottenere l'oggetto. – Ilir

+1

Quindi è :-). . . risposta corretta – jewelsea

Problemi correlati