`
yunhaifeiwu
  • 浏览: 161275 次
  • 性别: 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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics