javafx 2 的表格 绑定到 map

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

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

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


界面是这样的

[img]http://dl2.iteye.com/upload/attachment/0107/8056/78215cf3-63d1-39cd-8ca8-6aa9220fe9c7.png[/img]



/*
* 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 data = FXCollections.observableArrayList (
person.putNewRow("张","三","[email protected]"),
person.putNewRow("李","四","[email protected]"),
person.putNewRow("王","二","[email protected]"),
person.putNewRow("刘","七","[email protected]")
);

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 row=new LinkedHashMap();
protected List colIds=null;

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

@Override
public ObservableValue call(TableColumn.CellDataFeatures 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 p.row.put(colIds.get(i), new SimpleStringProperty(datas[i]));
}
return p;
}

public Person editRow(String... datas){
for(int i=0;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 getRow() {
return row;
}

public Callback, ObservableValue> getMapCellValueFactory() {
return mapCellValueFactory;
}

public List getColIds() {
return colIds;
}

}

}

你可能感兴趣的:(java,JAVAFX,tableview,map)