2012-11-27 4 views
7

Ich habe die folgenden Rückruf auf die ausgewählte Zelle eines Tableview hören:JavaFX, erhalten das referenzierte Objekt durch einen 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); 

          } 
         } 
        }); 

Nun Ich mag würde das MyFTPFile-Objekt erhalten, die durch die Zelle verwiesen wird, das ist doppelt geklickt, so dass ich es an eine andere Klasse weitergeben und Sachen machen kann ... Irgendeine Idee, wie man das macht ???

Vielen Dank im Voraus.

Antwort

10

Das MyFTPFile-Objekt ist der Zeile der Zelle zugeordnet, daher ist es, wie der Fragesteller in seinem Kommentar darauf hingewiesen hat, über cell.getTableRow().getItem() abrufbar.

Zuerst dachte ich, dies sollte cell.getItem() sein, die den Datenwert zurückgibt, der mit der Zelle verbunden ist. In den meisten Fällen ist der Zellendatenwert jedoch eine Eigenschaft des Sicherungselements und nicht das Objekt selbst (z. B. ein Dateinamensfeld eines MyFTPFile-Objekts).

Executable Proben für Neugierige.

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, aber es ist cell.getTableRow() getItem(), die ich habe, verwenden, um das Objekt zu erhalten. – Ilir

+1

Also ist es :-). . . Antwort korrigiert. – jewelsea

Verwandte Themen