欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaFX之TableView的使用详解

程序员文章站 2024-02-18 12:27:46
tableview,算是一个很重要的控件,几乎随处可见,而且功能强大,数据展示效果良好。所以,在javafx中,我们自然而然也应该学习一下tableview的使用。 下面...

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

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

JavaFX之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中即可。

如下图所示:

JavaFX之TableView的使用详解

上面是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更新进度较慢,最后可能会继续其他的开发和学习。