javafx中TableView自定义单元格-可编辑且限制长度和格式
javafx自定义单元格,实现可编辑、且限制长度和格式
1 pd_tc_hex.setCellFactory(new Callback<TableColumn<PreinstallData,String>, TableCell<PreinstallData,String>>() 2 { 3 @Override 4 public TableCell<PreinstallData, String> call(TableColumn<PreinstallData, String> param) 5 { 6 TableCell<PreinstallData, String> tableCell = new TableCell<PreinstallData, String>() 7 { 8 @Override 9 public void commitEdit(String newValue) 10 { 11 //如果小于最大值,补0 12 int maxLength = cdData.get(communicationDataTableView.getSelectionModel().getSelectedIndex()).getLength()/8; 13 if(newValue.length() < maxLength) 14 { 15 for(int i = newValue.length();i<maxLength;i++) 16 { 17 newValue = "0" + newValue; 18 } 19 } 20 21 //设置数据 22 pdData 23 .get(preinstallDataTableView.getSelectionModel().getSelectedIndex()) 24 .setHexString(newValue.toUpperCase()); 25 26 super.commitEdit(newValue.toUpperCase()); 27 28 //清空样式 29 setGraphic(null); 30 setText(String.valueOf(this.getUserData())); 31 } 32 33 @Override 34 public void cancelEdit() 35 { 36 //清空样式 37 super.cancelEdit(); 38 setGraphic(null); 39 setText(String.valueOf(this.getUserData())); 40 } 41 42 @Override 43 public void startEdit() 44 { 45 super.startEdit(); 46 //清空样式 47 setText(""); 48 setGraphic(null); 49 50 //修改样式 51 HBox hBox = new HBox(); 52 TextField tf = new TextField(String.valueOf(this.getUserData())); 53 tf.setPrefWidth(this.getWidth()); 54 tf.setTextFormatter(new TextFormatter<String>(new UnaryOperator<Change>() 55 { 56 @Override 57 public Change apply(Change t) 58 { 59 String value = t.getText(); 60 61 //没有改变值不做改变 62 int maxLength = cdData.get(communicationDataTableView.getSelectionModel().getSelectedIndex()).getLength()/8; 63 if(value.equals("")) 64 { 65 return t; 66 } 67 68 //限制输入 69 if(value.matches("[0-9A-Fa-f]")) 70 { 71 int changeLength = tf.getSelectedText().length(); 72 73 //如果当前没有选中 74 if(changeLength == 0) 75 { 76 if(tf.getText().length()>=maxLength) 77 { 78 t.setText(""); 79 return t; 80 } 81 } 82 return t; 83 } 84 return null; 85 } 86 })); 87 88 hBox.getChildren().add(tf); 89 this.setGraphic(hBox); 90 91 //获得聚焦 92 tf.requestFocus(); 93 94 tf.setOnKeyPressed(new EventHandler<KeyEvent>() 95 { 96 @Override 97 public void handle(KeyEvent e) 98 { 99 if(e.getCode() == KeyCode.ENTER) 100 { 101 commitEdit(tf.getText()); 102 } 103 } 104 }); 105 } 106 107 @Override 108 protected void updateItem(String item, boolean empty) 109 { 110 super.updateItem(item, empty); 111 this.setUserData(item); 112 113 if (empty) 114 { 115 setText(null); 116 setGraphic(null); 117 } 118 else 119 { 120 setText(item); 121 } 122 } 123 }; 124 return tableCell; 125 } 126 });