【问题标题】:Javafx, get the object referenced by a TableCellJavafx,获取TableCell引用的对象
【发布时间】:2012-11-15 03:05:44
【问题描述】:

我在 TableView 的选定单元格上监听了以下回调:

        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);

                            }
                        }
                    });

现在,我想获取单元格引用的 MyFTPFile 对象,该对象被双击,这样我就可以将它传递给另一个类并做一些事情......知道怎么做吗???

提前致谢。

【问题讨论】:

    标签: javafx-2


    【解决方案1】:

    MyFTPFile 对象与单元格的行相关联,因此,正如提问者在评论中指出的那样,它可以通过cell.getTableRow().getItem() 检索。

    一开始我以为这应该是cell.getItem(),它返回与单元格关联的数据值。但是,大多数时候,单元格数据值将是支持项的属性,而不是对象本身(例如 MyFTPFile 对象的文件名字段)。

    好奇的可执行示例:

    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 +
              '}';
        }
      }
    
    }
    

    【讨论】:

    • Thx,但它是 cell.getTableRow().getItem(),我必须使用,来获取 Object。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多