JavaFX之TableView的使用

原创 2013年12月05日 17:58:02

  声明:   本博客文章原创类别的均为个人原创,版权所有。转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http://www.wjfxgame.com

   

  TableView,算是一个很重要的控件,几乎随处可见,而且功能强大,数据展示效果良好。所以,在JavaFX中,我们自然而然也应该学习一下TableView的使用。


  下面我们先看看TableView的效果图:

  


  每一列都是一个TableColumn,我们可以直接创建也可以在JavaFX Scene Builder中创建好。

  TableView的数据填充,需要一个ObservableList。其中需要一个类来做数据填充。

  下面看看我们数据填充的类:

  

import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleStringProperty;

/**
 *
 * @author wing
 */
public final class DownloadData {
       private final SimpleStringProperty fileName = new SimpleStringProperty();
       private final SimpleStringProperty status = new SimpleStringProperty();
       private final SimpleStringProperty dlSpeed = new SimpleStringProperty();
       private final SimpleDoubleProperty progress = new SimpleDoubleProperty();
       private final SimpleStringProperty downloadSize = new SimpleStringProperty();      
       private final SimpleStringProperty dlPercent = new SimpleStringProperty();    
       private String uuid;
       
         public DownloadData(String filename, double progress) {
           setFileName(filename);
           setProgress(progress);
       }     
       
       public DownloadData(String status, String filename, String dlSpeed, double progress) {
           setStatus(status);
           setFileName(filename);
           setDlSpeed(dlSpeed);
           setProgress(progress);
       }
    /**
     * @return the fileName
     */
    public String getFileName() {
        return fileName.get();
    }

    /**
     * @param fileName the fileName to set
     */
    public void setFileName(String fileName) {
        this.fileName.set(fileName);
    }
    
    public SimpleStringProperty fileNameProperty(){
        return fileName;
    }

    /**
     * @return the status
     */
    public String getStatus() {
        return status.get();
    }

    /**
     * @param status the statusto set
     */
    public void setStatus(String status) {
        this.status.set(status);
    }
    
   public SimpleStringProperty statusProperty(){
        return status;
    }

    /**
     * @return the String
     */
    public String getDlSpeed() {
        return dlSpeed.get();
    }

    /**
     * @param dlSpeed the dlSpeed to set
     */
    public void setDlSpeed(String dlSpeed) {
        this.dlSpeed.set(dlSpeed);
    }

    public SimpleStringProperty dlSpeedProperty(){
        return dlSpeed;
    }
    
    /**
     * @return the progress
     */
    public double getProgress() {
        return progress.get();
    }

    /**
     * @param progress the progress to set
     */
    public void setProgress(double progress) {
        this.progress.set(progress);
    }
    
    public SimpleDoubleProperty progressProperty(){
        return progress;
    }   
    
    public String getDownloadSize() {
        return downloadSize.get();
    }

    public void setDownloadSize(String downloadSize) {
        this.downloadSize.set(downloadSize);
    }

    public SimpleStringProperty downloadSizeProperty(){
        return downloadSize;
    }
    
    public String getDlPercent() {
        return dlPercent.get();
    }

    public void setDlPercent(String dlPercent) {
        this.dlPercent.set(dlPercent);
    }

    public SimpleStringProperty dlPercentProperty(){
        return dlPercent;
    }
      
    public String getUUID() {
        return uuid;
    }

    public void setUUID(String uuid) {
        this.uuid = uuid;
    }  
}

  记住,用作数据填充的类,一定要用JavaFX的Property机制,可以进行数据绑定,这样在我们改变ObservableList的时候,TableView的数据才会实时刷新。


  

private final ObservableList<DownloadData> data
            = FXCollections.observableArrayList();


ObservableList<TableColumn> observableList = mDownloadTable.getColumns();

observableList.get(0).setCellValueFactory(new PropertyValueFactory("status"));
observableList.get(1).setCellValueFactory(new PropertyValueFactory("fileName"));
observableList.get(2).setCellValueFactory(new PropertyValueFactory("dlSpeed"));
observableList.get(3).setCellValueFactory(new PropertyValueFactory("downloadSize"));
observableList.get(4).setCellValueFactory(new PropertyValueFactory("progress"));
observableList.get(4).setCellFactory(ProgressBarTableCell.forTableColumn());
observableList.get(5).setCellValueFactory(new PropertyValueFactory("dlPercent"));

mDownloadTable.setItems(data);
  

  我们通过TableView.getColumns来获取TableView的所有列。

  CellValueFactory指的是TableView每一列里填充的数据。我们这里简单的使用PropertyValueFacotry。后面的要对应你DownloadData中的Property属性名。

  CellFactory我们可以指定TableView中某一个Cell的视图类型。大家可以看到我用到了个ProgressBar。


  另外CellFactory,JavaFX中自带部分的CellFactory,详细的大家可以在javafx.scene.control.cell包中找到。


  接着我们通过创建DownloadData,设置数据,并添加到ObservableList中即可。


  如下图所示:

  

  

  上面是TableView的数据填充。

  另外,JavaFX中的事件也不像Java或者Android里面用onItemClick之类的来执行某一项的点击。

  JavaFX中的控件的很多事件有着鲜明的特色,就是使用Property的ChangeListener来执行。


  如下:

  

  mMenuTree.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
        mMenuTree.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {

            @Override
            public void changed(ObservableValue ov, Object t, Object t1) {
                int index = mMenuTree.getSelectionModel().getSelectedIndex();
                switch (index) {
                    case 1:   //所有任务
                        refreshTableData(0, 1, 2);
                        break;
                    case 2:   //正在下载
                        refreshTableData(0);
                        break;
                    case 3:  //已完成
                        refreshTableData(2);
                        break;
                    case 4:  //垃圾箱
                        refreshTableData(-1);
                        break;
                }
            }
        });

    这里是TreeView的事件,通过监听selectItemProperty的改变来做相应的操作,同理,TableView也是一样的通过监听selectXXXProperty属性来操作Item的点击等事件。


  要下班了,这一节就暂时到这里了。

----------------------------------------------------

  文章中用到的一些图片,是最近没事做的时候用JavaFX练手的工具。

  不过由于JavaFX更新进度较慢,最后可能会继续其他的开发和学习。

----------------------------------------------------

  本博客文章原创类别的均为个人原创,版权所有。转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http://www.wjfxgame.com


相关文章推荐

JavaFx TableView 实时的根据行对象数据变化刷新

1, 最简单粗暴,但也最不合理的做法 在数据对象更新后,调用 table.refresh() 方法。 这样做,表格实际上是刷新了,因为绑定的list里的对象确实发生了变化。 * 但是,这样并不符...

javafx TableView中的TableColumn如何填充的自带类

在javafx中TableView中有TableColumn,即每一列,对于每一列中每个单元怎么填充,javafx的官方文档提供了两个实现类 public class MapValueFactory...

javafx tableview 绑定字段的两种方法

第一种     @FXML TableColumn filenamecol;             filepathcol.setCellValueFactory(new Propert...

JavaFX表格控件TableView高级应用:自动添加ID列、删除操作列、单元格内容个性化渲染

问题描述我们在用Javafx开发应用程序的时候,TableView是比较常用的用来展示数据的控件,但是它的灵活性确实没有WEB开发里面的控件好,比如,我遇到的问题就有: 数据库存储里面的ID列(序号)...

javafx TableView 添加事件

this.listBox.setOnMouseClicked(new EventHandler() {             @Override             public void ...

JavaFX学习之道:JavaFX之TableView

TableView表     TableColumn列  构建一个表主要有TableView,TableColumn,ObservableList,Bean。  添加列table.getColu...

JavaFX之TableView的TableRow

TableRow 通过setRowFactory,对行的双击进行操作  [java] view plain copy tableView.setRowFactory(new...
  • tunni
  • tunni
  • 2016年10月14日 20:51
  • 1096

为TableView的行实现双击事件

当我们使用一个表格来展示信息时,存在一个场景——查看或者编辑指定行的数据。一般我们有以下几种操作方式:1) 直接在表格行尾添加一个编辑按钮 2) 行首增加一个checkbox,选中后再点击表格上方或者...
  • alanzyy
  • alanzyy
  • 2015年10月16日 08:30
  • 3802

javaFx中tableview使用cellfactory进行赋值的问题

在javafx中,可以使用cellfactory来进行赋初值 下面我将举例进行说明 首先当对应的fxml文件被调用时,他里面的相对应的controller中的intiablize方法将被自动调用,...

javafx由浅到深的认识(二)——Pagination控件和TableView控件的运用

上文已介绍完一些javafx中常用到的控件,这节我来详细介绍一下我们经常会用到的分页控件以及表格控件,首先先明确一下分页控件的作用以及一些语法,分页控件的作用是用来显示大量数据的一种手段,可以通过分页...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JavaFX之TableView的使用
举报原因:
原因补充:

(最多只允许输入30个字)