`
yunhaifeiwu
  • 浏览: 162877 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

javafx 2 的表格 绑定到 map

    博客分类:
  • java
阅读更多

当 一个tabview 要不同时候展现不同的数据表时,往往需要tabview的数据绑定到一个动态集合上。 下面的例子就展示了这种功能。

其中Person类,可以是共用,随便取的一个名字,不要以为仅仅是表示人名才能用

本例是 jdk 1.8  所写。 用了lamda达表达式


界面是这样的




/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package basetech.hello;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.function.Predicate;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Separator;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.ToolBar;
import javafx.scene.control.cell.PropertyValueFactory;
import static javafx.scene.input.KeyCode.S;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.util.Callback;

/**
 *
 * @author cloud
 */
public class TableWithMapDemo extends Application{
    
     
    private  Button addBT= new Button("新增");
    private  Button editBT= new Button("修改");
    private  Button cancelBT= new Button("取消");
    private  Button saveBT= new Button("保存"); 
    private  Button deleteBT= new Button("删除");
    private boolean  isAdd=false;
    
    private  TableView tableView = new TableView();
    
    private  TextField firstnameTF= new TextField();
    private  TextField lastnameTF= new TextField();
    private  TextField emailTF= new TextField();
    private  Alert alert=new Alert(Alert.AlertType.INFORMATION);
    
    private Person person=Person.create("first","second","email");
    final ObservableList<Person> data = FXCollections.observableArrayList (
            person.putNewRow("张","三","zhangsan@email.com"),
            person.putNewRow("李","四","lisi@email.com"),
            person.putNewRow("王","二","wanger@email.com"),
            person.putNewRow("刘","七","liuqi@email.com")
    );
    
    private Parent createToolbar(){
        for(int i=0;i<2000;i++){
            String id=Integer.toString(i);
            data.add(person.putNewRow("姓"+id,"名"+id,"email"+id+"@mail.com"));
        }
        ToolBar toolbar = new ToolBar();     
        Button cellBT=new Button("操作指定单元格");
        cellBT.setOnAction( e->{
            //对指定单元格操作
            Person person=(Person)tableView.getItems().get(2);
            alert.setContentText(person.getColData(0));
            alert.show();
            // 得到选中行 列
            int selectRow=tableView.getSelectionModel().getFocusedIndex();
            int selectCol=((TablePosition)tableView.getSelectionModel().getSelectedCells().get(0)).getColumn();
            Object row=tableView.getSelectionModel().getSelectedItem();
           
                
        });
        toolbar.getItems().addAll(addBT,editBT,saveBT,cancelBT,deleteBT,cellBT); 
        
        tableView.setStyle(" .column-header {" +
                            "    -fx-size: 300;" +
                         "}");
 
        return toolbar;
    }
    private  Parent createEditPane(){
        GridPane grid=new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(3);
        grid.setVgap(20);        
        grid.setPadding(new Insets(25,25,25,25));
        grid.setGridLinesVisible(false);
       
        Label lb=new  Label("姓");  
        grid.add(lb, 0, 0);    
        grid.add(firstnameTF, 1, 0);
        Separator sp=new Separator(Orientation.VERTICAL);
        sp.setOpacity(0);
        grid.add(sp, 2, 0);
        
        lb=new  Label("名");
        grid.add(lb, 3, 0);    
        grid.add(lastnameTF, 4, 0);
        sp=new Separator(Orientation.VERTICAL);
        sp.setOpacity(0);
        grid.add(sp, 5, 0);
        
        lb=new  Label("Email");
        grid.add(lb, 6, 0);    
        grid.add(emailTF, 7, 0);
        sp=new Separator(Orientation.VERTICAL);
        sp.setOpacity(0);
        grid.add(sp, 8, 0);
        
            
        
        for (int i=0;i<9;i++){
            ColumnConstraints column1 = new ColumnConstraints();
            if (i%3==0){
                column1.setPrefWidth(60);
                column1.setHalignment(HPos.RIGHT);//水平居中
            } else if (i%3==2){
                column1.setPrefWidth(10);
                column1.setHalignment(HPos.LEFT);//水平居中
            } else {
                column1.setPercentWidth(20);
                column1.setHalignment(HPos.LEFT);//水平居中
            }
            grid.getColumnConstraints().add(column1);
        }
        
        
        return grid;
    }
    private Parent createTop(){
        GridPane grid=new GridPane();
        grid.add(createToolbar(), 0, 0,2,1);
        grid.add(createEditPane(), 1, 1,1,1);
        
        ColumnConstraints column1 = new ColumnConstraints();
        column1.setPercentWidth(5); 
        grid.getColumnConstraints().add(column1);
        
        ColumnConstraints column2 = new ColumnConstraints();
        column2.setPercentWidth(95);
        column2.setHalignment(HPos.RIGHT);//水平居中
        grid.getColumnConstraints().add(column2);
 
        return grid; 
    }
    private Parent createContent() {
      
        TableColumn firstNameCol = new TableColumn();
        firstNameCol.setText("First");   
        firstNameCol.setId(person.getColId(0));
        firstNameCol.setCellValueFactory(person.getMapCellValueFactory());
        firstNameCol.prefWidthProperty().bind(tableView.widthProperty().divide(3)); // w * 1/3
     
        TableColumn lastNameCol = new TableColumn();
        lastNameCol.setId(person.getColId(1));
        lastNameCol.setText("Last");        
        lastNameCol.setCellValueFactory(person.getMapCellValueFactory());
        lastNameCol.prefWidthProperty().bind(tableView.widthProperty().divide(3)); // w * 1/3
        
        TableColumn emailCol = new TableColumn();
        emailCol.setId(person.getColId(2));
        emailCol.setText("Email");
        emailCol.setMinWidth(200);
        emailCol.setCellValueFactory(person.getMapCellValueFactory());
        emailCol.prefWidthProperty().bind(tableView.widthProperty().divide(3)); // w * 1/3
        
        tableView.setItems(data);
        tableView.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
        
        BorderPane borderPane=new BorderPane();
        borderPane.setTop(createTop());
        borderPane.setCenter(tableView);
          
        return borderPane;
    }
    private void toolbarAction(){
 
        saveBT.setDisable(true);
        cancelBT.setDisable(true);
        alert.getDialogPane().setHeaderText(null);
        saveBT.setOnAction(e->{
            alert.setContentText("按下了保存按钮");
            alert.show();
            saveBT.setDisable(true);
            cancelBT.setDisable(true);
            addBT.setDisable(false);
            editBT.setDisable(false);
            deleteBT.setDisable(false);
            if(isAdd){
                Person p=  person.putNewRow(firstnameTF.getText(),lastnameTF.getText(),emailTF.getText());
                data.add(p);
              
            } else {
                Person person =(Person)tableView.getSelectionModel().getSelectedItem();
                person.editRow(firstnameTF.getText(),lastnameTF.getText(),emailTF.getText());
                
            }
            isAdd=false;
        });
      
        cancelBT.setOnAction(e->{
            alert.setContentText("按下了取消按钮");
            alert.show();
            saveBT.setDisable(true);
            cancelBT.setDisable(true);
            addBT.setDisable(false);
            editBT.setDisable(false);
            deleteBT.setDisable(false);
            isAdd=false;
        });
         deleteBT.setOnAction(e->{
             
            data.remove(tableView.getSelectionModel().getFocusedIndex());
        });
        addBT.setOnAction(e->{
            saveBT.setDisable(false);
            cancelBT.setDisable(false);
            addBT.setDisable(true);
            editBT.setDisable(true);
            deleteBT.setDisable(true);
            isAdd=true;
        });
        editBT.setOnAction(e->{
            saveBT.setDisable(false);
            cancelBT.setDisable(false);
            addBT.setDisable(true);
            editBT.setDisable(true);
            deleteBT.setDisable(true);
            isAdd=false;
            
           
        });
        tableView.setOnMouseClicked(e->{
            if(e.getButton().equals(MouseButton.SECONDARY)){
                 //展示 选中行列。注意:TablePosition还有表的 选中游标
                 TablePosition pos=(TablePosition)tableView.getSelectionModel().getSelectedCells().get(0);
                 String str="ROW:"+Integer.toString(pos.getRow())+",COL:"+Integer.toString(pos.getColumn());
                 alert.setContentText(str);
                 alert.show();
            } else {
//                //显示选中的单行序号
//                alert.setContentText(Integer.toString(tableView.getSelectionModel().getSelectedIndex()));
//                alert.show();
                Person ps=(Person)tableView.getSelectionModel().getSelectedItem();                
                this.firstnameTF.setText(ps.getColData(0));
                this.lastnameTF.setText(ps.getColData(1));
                this.emailTF.setText(ps.getColData(2));
            }   
        });
         tableView.selectionModelProperty().addListener( new ChangeListener(){

                @Override
                public void changed(ObservableValue observable, Object oldValue, Object newValue) {
                    alert.setContentText("选中的行是:"+tableView.getSelectionModel().getFocusedIndex());
                    alert.show();
                }
         
         });
    }
    
    @Override
    public void start(Stage primaryStage) throws Exception {
        toolbarAction();
        primaryStage.setScene(new Scene(createContent(),400,300));
        primaryStage.show();
    }
    public static void main(String[] args){
         launch(args);
    }
    
     public static class Person {
        private final  LinkedHashMap<String,SimpleStringProperty> row=new LinkedHashMap();
        protected   List<String> colIds=null;

        private  Callback< TableColumn.CellDataFeatures<Person,String>,ObservableValue<String>> 
                mapCellValueFactory=new  Callback< TableColumn.CellDataFeatures<Person,String>,ObservableValue<String>> (){

            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> param) {
                SimpleStringProperty rtn= param.getValue().getCol(param.getTableColumn().getId());
                return rtn;
            }
            
            
        };
        private Person(){};

        public static Person  create(String... ids){
           
            Person p=new Person();
            p.colIds=new ArrayList();
            for(String id:ids){
                p.colIds.add(id);
            }   
            return p;
        }
        public Person copyStuct(){
            Person p=new Person();
            for (String id:this.colIds){
                p.colIds.add(id);
            }
           return p;
        }
       
        public Person  putNewRow(String... datas){
            Person p=new Person();
            p.colIds=this.colIds;
            for(int i=0;i<datas.length;i++){
                p.row.put(colIds.get(i), new SimpleStringProperty(datas[i]));
            }
            return p;
        }
        
        public Person editRow(String... datas){
            for(int i=0;i<datas.length;i++){
                SimpleStringProperty p=row.get(colIds.get(i));
                p.setValue(datas[i]);
            }
            return this;
        }
     
        public Person putColData(String col,String data){
            row.put(col, new SimpleStringProperty(data));
            return this;
        } 
        public String getColData(int i){
            String id=colIds.get(i);
            return row.get(id).getValue();
        }
        public String getColId(int i){
            String id=colIds.get(i);
            return id;
        }
        
        
        public String getColData(String colId){
            return row.get(colId).getValue();
        }
        public SimpleStringProperty getCol(String colId){
            return row.get(colId);
        }

        public LinkedHashMap<String, SimpleStringProperty> getRow() {
            return row;
        }

        public Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>> getMapCellValueFactory() {
            return mapCellValueFactory;
        }

        public List<String> getColIds() {
            return colIds;
        }
         
    }

}

  • 大小: 16.4 KB
分享到:
评论

相关推荐

    JavaFx中的表格

    在JavaFX中,表格是一种强大的可视化组件,用于展示和操作数据。这个压缩包包含了一些关键的源码文件,如`CustomerTable.fx`、`Cell.fx`和`HeaderCell.fx`,它们是构建JavaFX表格应用的核心部分。让我们深入探讨这些...

    javafx之属性与绑定

    "javafx之属性与绑定" JavaFX 是一种新的 Java 技术,用于处理动态画面,画面精美令人赞叹。了解 JavaFX 的属性和绑定是非常重要的。 JavaFX 的属性是基于 JavaBean 的模式,但做了扩展和改进。JavaFX 的属性经常...

    JavaFX2.0_表格框TableView

    在JavaFX 2.0中,TableView是一种强大的控件,用于以表格的形式展示数据。它提供了灵活的布局和丰富的功能,使开发者能够轻松地构建数据驱动的用户界面。以下是关于JavaFX 2.0表格框TableView及其核心组件的详细解释...

    JavaFX+Jfoenix 学习笔记(三)--TableView数据表格源码

    2. **数据绑定**: - 要将数据加载到TableView,我们需要一个ObservableList,这是JavaFX中的一个动态列表,可以监听其内容的变化并自动更新界面。 - 使用TableView的items属性将ObservableList绑定到TableView,...

    javafx 2.0读取_简单表格的案例_oracle数据组装成

    本案例主要关注如何使用JavaFX 2.0来读取数据并展示在简单的表格中,特别是从Oracle数据库中获取数据并进行组装的过程。 首先,我们需要确保已经安装了JavaFX SDK,并且在项目中正确设置了相关的依赖。JavaFX 2.0...

    jAVAfx的增删改查demo文件

    2. **数据表格组件(TableView)** - `TableView`是JavaFX中的一个核心组件,用于显示二维数据表格。 - 可以通过设置`TableColumn`来定义列,每个`TableColumn`对应一个数据字段。 - 支持数据绑定,可以将数据...

    JavaFX 2.0 電子書 - Pro JavaFX 2

    In Pro JavaFX 2: A Definitive Guide to Rich Clients with Java Technology, Jim Weaver, Weiqi Gao, Stephen Chin, Dean Iverson, and Johan Vos show you how you can use the JavaFX platform to create rich-...

    JavaFX2开发教程

    JavaFX2.0是JavaFX的重大更新,与之前的1.3版本存在许多不兼容性,因此,如果要涉足JavaFX开发,建议直接采用2.0版本。JavaFX2.0引入了许多新特性,提升了用户体验和开发者的工作效率。 首先,安装JavaFX2.0 SDK是...

    JavaFX+Jfoenix 学习笔记(八)--事件、监听、属性绑定源码

    在“JavaFX+Jfoenix 学习笔记(八)--事件、监听、属性绑定源码”中,我们将深入探讨JavaFX中的事件处理、监听器和属性绑定。 1. **事件处理**: 在JavaFX中,事件是用户与应用程序交互时发生的动作,如点击按钮、...

    javafx2-demo

    javafx2-demo

    pro javaFX 2

    JavaFX是Sun Microsystems在2007年的JavaOne大会上宣布的一个新产品家族,其目标是使开发者能够开发出内容丰富的应用程序,并部署到各种消费者设备上,如手机、电视、车载系统以及浏览器等。 **关键知识点**: - *...

    Pro JavaFX 2

    In Pro JavaFX 2: A Definitive Guide to Rich Clients with Java Technology, Jim Weaver, Weiqi Gao, Stephen Chin, Dean Iverson, and Johan Vos show you how you can use the JavaFX platform to create rich-...

    javafx2 日期控件

    JavaFX2是一个强大的Java应用程序框架,用于创建丰富的图形用户界面(GUI)。在JavaFX2中,日期控件是用户界面中的重要元素,它允许用户选择日期或者进行日期相关的操作。这个压缩包文件“datecontrol”可能包含了一...

    Javafx2 系统托盘实现

    Javafx2 系统托盘实现

    javaFX Demo 模板案例

    总结来说,这个“javaFX Demo 模板案例”涵盖了JavaFX的主要特性,包括UI设计、图形绘制、媒体播放、数据绑定和样式定制。通过学习这个案例,开发者可以快速掌握JavaFX的基本用法,并为构建自己的富客户端应用打下...

    JavaFX2 API

    JavaFX2 API chm文件

    JavaFX2如何使用第三方字体(use custom fonts in JavaFX2)

    在JavaFX2中引入第三方字体是一项常见的需求,它允许开发者为应用程序添加独特的视觉风格。本文将详细介绍如何在JavaFX2中使用自定义字体,并通过一个简单的示例——`CustomFontApp`来阐述整个过程。 首先,你需要...

    JavaFx2-api.chw

    JavaFx2-api.chw虽然用的人少了,但是是个好东西

    基于JavaFx TableView的人员增删查改界面

    2. **TableView组件**:TableView是JavaFX中的一个核心组件,用于显示表格形式的数据。它允许你将数据模型与视图分离,这样可以方便地更新数据而不会影响界面的呈现。 3. **ObservableList**:在JavaFX中,为了与...

    JavaFx 2.x 地图缩放拖拽

    在JavaFX 2.x中,地图缩放和拖拽功能是构建交互式地图应用的关键部分。这个技术允许用户通过鼠标操作来改变地图的视角,放大查看细节或缩小以获取更广阔的视图,同时还能通过拖动来移动地图,查看不同区域。下面我们...

Global site tag (gtag.js) - Google Analytics