是否可以通过为子串提供另一种颜色来突出显示JavaFX 2中TableView单元格内的子串?如果是的话,这是如何实现的?
很高兴任何建议!
答案 0 :(得分:3)
Java7的一种可能解决方案。为您的手机使用cell factory。从工厂返回TextField。将TextField设置为not editable。将TextField的方法用于要突出显示的select the text(可能需要Platform.runLater方法来执行此操作,并且可能需要关注字段以允许选择文本)。一旦选择完成(并且真正显示),TextField上的Disable mouse input和focus traversion,以便用户也无法在Platform.runLater中更改选择。
对于Java8,您可以执行类似的操作,但不使用TextField,而是使用TextFlow并使用css或Java API在文本流中设置子文本样式。
如果您只想突出显示单元格中的所有文本,而不是某些部分,那么您可以使用标准Label加上CSS样式。部分文本突出显示的另一个解决方案是使用FlowPane,其中包含多个标签,每个标签具有不同的样式。
答案 1 :(得分:1)
有很多方法可以突出显示tableview单元格的子字符串。我使用了HBox
和label
,看起来不错。
这是我的代码:
public Callback<TableColumn<Address, String>, TableCell<Address, String>> getCellFactory() {
return new Callback<TableColumn<Address, String>, TableCell<Address, String>>() {
@Override
public TableCell<Address, String> call( final TableColumn<Address, String> param ) {
final TableCell<Address, String> cell = new TableCell<Address, String>() {
@Override
protected void updateItem( final String value, final boolean empty ) {
setGraphic( null );
if( null != getTableRow() && !empty ) {
final HBox hbox = new HBox();
hbox.setAlignment( Pos.CENTER_LEFT );
hbox.getChildren().clear();
if( null == value ) {
return;
}
final int index = value.toLowerCase().indexOf(str);
if( -1 == index ) {
//no match
hbox.getChildren().add( new Label( value ) );
} else {
//part of string before match
hbox.getChildren().add( new Label( value.substring( 0, index ) ) );
//matched part
final Label label = new Label( value.substring( index, index + str.length() ) );
label.setStyle( "-fx-background-color: #FFFFBF;-fx-text-fill: #FF0000;" );
hbox.getChildren().add( label );
//part of string after match
final int lastPartIndex = index + str.length();
if( lastPartIndex < value.length() ) {
hbox.getChildren().add( new Label( value.substring( lastPartIndex ) ) );
}
}
setGraphic( hbox );
}
}
};
return cell;
}
};
}