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 });

 

posted @ 2020-04-01 21:00  qinggua  阅读(1721)  评论(0编辑  收藏  举报