如何在javafx的tableview单元格字段中用另一个词替换一个词?
我正在tableview中搜索一个单词,有一个名为find的文本字段,它可以在tableview中查找任何文本,然后我想用javafx tableview中的其他文本替换该文本?我已经运行了查找单词的代码,但现在我需要替换代码,有人能帮我解决这个问题吗如何在javafx的tableview单元格字段中用另一个词替换一个词?,java,javafx,tableview,Java,Javafx,Tableview,我正在tableview中搜索一个单词,有一个名为find的文本字段,它可以在tableview中查找任何文本,然后我想用javafx tableview中的其他文本替换该文本?我已经运行了查找单词的代码,但现在我需要替换代码,有人能帮我解决这个问题吗 public void onClickSearch(ActionEvent event) { String st=srep.getText(); //sbtn.setOnAction((ActionEvent event1) -&
public void onClickSearch(ActionEvent event) {
String st=srep.getText();
//sbtn.setOnAction((ActionEvent event1) -> {
tc_source.setCellFactory((column) -> {
return new TableCell<File, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
setText(null);
setStyle("");
}
else {
if (!srep.getText().isEmpty() && item.toLowerCase().contains(srep.getText().toLowerCase())) {
Double rowHeight = this.getTableRow().getHeight();
setGraphic(buildTextFlow(item ,srep.getText()));
setHeight(rowHeight);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
else {
setText(item);
setTextFill(javafx.scene.paint.Color.BLACK);
setStyle("");
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
}
}
public TextFlow buildTextFlow(String text, String filter) {
int filterLength = filter.length();
if (filterLength == 0) {
return new TextFlow(createNormalText(text));
} Font font = Font.font("Italic", 12);
java.awt.Color color= java.awt.Color.BLUE ;
TextFlow t = new TextFlow();
String lowerText = text.toLowerCase();
filter = filter.toLowerCase();
int index1 = 0;
int matchIndex=0;
while ((matchIndex = lowerText.indexOf(filter, index1)) != -1) {
if (index1 != matchIndex) {
t.getChildren().add(createNormText(text.substring(index1, matchIndex)));
}
index1 = matchIndex + filterLength;
t.getChildren().add(createText(text.substring(matchIndex, index1), color));
}
if (index1 != text.length()) {
t.getChildren().add(createNormText(text.substring(index1)));
}
return t;
}
};
});
}
public void onClickSearch(ActionEvent事件){
字符串st=srep.getText();
//sbtn.setOnAction((ActionEvent1)->{
tc_source.setCellFactory((列)->{
返回新的TableCell(){
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
如果(项==null | |空){
设置图形(空);
setText(空);
设置样式(“”);
}
否则{
如果(!srep.getText().isEmpty()&&item.toLowerCase().contains(srep.getText().toLowerCase())){
Double rowHeight=this.getTableRow().getHeight();
setGraphic(buildTextFlow(item,srep.getText());
设置高度(行高);
setContentDisplay(仅限ContentDisplay.GRAPHIC_);
}
否则{
setText(项目);
setTextFill(javafx.scene.paint.Color.BLACK);
设置样式(“”);
setContentDisplay(仅限ContentDisplay.TEXT_);
}
}
}
公共文本流buildTextFlow(字符串文本,字符串过滤器){
int filterLength=filter.length();
如果(过滤器长度==0){
返回新的文本流(createNormalText(文本));
}Font=Font.Font(“斜体”,12);
java.awt.Color=java.awt.Color.BLUE;
TextFlow t=新的TextFlow();
String lowerText=text.toLowerCase();
filter=filter.toLowerCase();
int index1=0;
int matchIndex=0;
而((matchIndex=lowerText.indexOf(filter,index1))!=-1){
if(index1!=匹配索引){
t、 getChildren().add(createNormText(text.substring(index1,matchIndex));
}
index1=匹配索引+过滤器长度;
t、 getChildren().add(createText(text.substring(matchIndex,index1),color));
}
如果(index1!=text.length()){
t、 getChildren().add(createNormText(text.substring(index1));
}
返回t;
}
};
});
}
替换cellFactory
不会自动将列的单元格替换为新工厂的单元格。否则,无法强制TableView
重新创建其单元格。初始cellFactory
返回的单元格应根据搜索文本动态更改:
private final StringProperty searchText = new SimpleStringProperty();
TableView
创建/初始化
注意:你应该考虑重用<代码>文本流< /> >,因为每次搜索或滚动足够远的<代码> TrimeFux和它的所有孩子都会为当前代码中的每个单元格重新创建。
tc_source.setCellFactory(column -> new TableCell<File, String>() {
private final ChangeListener<String> listener = (o, oldValue, newValue) -> {
updateContents(getItem(), newValue);
};
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
searchText.removeListener(listener);
if (item == null || empty) {
setGraphic(null);
setText(null);
} else {
updateContents(item, searchText.get());
searchText.addListener(listener);
}
}
private void updateContents(String item, String search) {
if (search == null || search.isEmpty() || !item.toLowerCase().contains(search.toLowerCase())) {
setText(item);
setTextFill(javafx.scene.paint.Color.BLACK);
setContentDisplay(ContentDisplay.TEXT_ONLY);
} else {
double rowHeight = this.getTableRow().getHeight();
setGraphic(buildTextFlow(item, search));
setHeight(rowHeight);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
}
private TextFlow buildTextFlow(String text, String filter) {
int filterLength = filter.length();
if (filterLength == 0) {
return new TextFlow(createNormalText(text));
} Font font = Font.font("Italic", 12);
java.awt.Color color= java.awt.Color.BLUE; // why are we using the awt class here?
TextFlow t = new TextFlow();
String lowerText = text.toLowerCase();
filter = filter.toLowerCase();
int index1 = 0;
int matchIndex=0;
while ((matchIndex = lowerText.indexOf(filter, index1)) != -1) {
if (index1 != matchIndex) {
t.getChildren().add(createNormText(text.substring(index1, matchIndex)));
}
index1 = matchIndex + filterLength;
t.getChildren().add(createText(text.substring(matchIndex, index1), color));
}
if (index1 != text.length()) {
t.getChildren().add(createNormText(text.substring(index1)));
}
return t;
}
});
public void onClickSearch(ActionEvent event) {
searchText.set(srep.getText());
}