【问题标题】:Jfx/TableColumn.setCellFactory with multiple colors in one TableCellJfx/TableColumn.setCellFactory 在一个 TableCell 中有多种颜色
【发布时间】:2017-06-30 11:45:42
【问题描述】:

在 JavaFx/TableView 中,是否可以为文本获取具有多种颜色的 TableCell?我已经使用“文本”尝试了以下代码,其中每个字符都将是 RED/BLUE/RED/BLUE...但单元格仍然是黑色的。

   (...)
    tableColumn.setCellFactory(tc -> new TableCell<MyObject, String>() { 
        @Override
        protected void updateItem(final String item, boolean empty) {
            super.updateItem(item, empty);
            if(item==null) return;
            this.setText(item);

            final List<Text> L=new ArrayList<>(item.length());
            for(int i=0;i< item.length();++i) {
                final Text txt=new Text(String.valueOf(item.charAt(i)));
                txt.setStroke(i%2==0?Color.RED:Color.BLUE);
                L.add(txt);
                }
            this.getChildren().setAll(L);
        }
    });
 (...)

有什么办法可以做到这一点吗?谢谢。

【问题讨论】:

    标签: javafx tableview uicolor


    【解决方案1】:

    创建一个TextFlow 来保存Text 实例并将其设置为单元格的图形。另请注意,您有一个错误(如果您从表格的列表中删除项目,或者如果您滚动可能会变得明显):如果单元格为空,您需要清除文本和图形。

    tableColumn.setCellFactory(tc -> new TableCell<MyObject, String>() { 
    
        final TextFlow textFlow = new TextFlow();
    
        @Override
        protected void updateItem(final String item, boolean empty) {
            super.updateItem(item, empty);
            if(item==null) {
                setText(null);
                setGraphic(null);
                return ;
            }
    
            this.setText(item);
    
            final List<Text> L=new ArrayList<>(item.length());
            for(int i=0;i< item.length();++i) {
                final Text txt=new Text(String.valueOf(item.charAt(i)));
                txt.setStroke(i%2==0?Color.RED:Color.BLUE);
                L.add(txt);
            }
            textFlow.getChildren().setAll(L);
            setGraphic(textFlow);
        }
    });
    

    这是一个 SSCCE:

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    import java.util.stream.Collectors;
    
    import javafx.application.Application;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    import javafx.scene.Scene;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableColumn.CellDataFeatures;
    import javafx.scene.control.TableView;
    import javafx.scene.paint.Color;
    import javafx.scene.text.Text;
    import javafx.scene.text.TextFlow;
    import javafx.stage.Stage;
    
    public class TableWithAlternateColorText extends Application {
    
        private final Random rng = new Random();
        private final String[] bases = "ACGT".split("") ;
    
        @Override
        public void start(Stage primaryStage) {
            TableView<StringProperty> table = new TableView<>();
            TableColumn<StringProperty, String> col = new TableColumn<>("Sequence");
            col.setCellValueFactory(CellDataFeatures::getValue);
            col.setCellFactory(tc -> new TableCell<StringProperty, String>() { 
    
                final TextFlow textFlow = new TextFlow();
    
    
                @Override
                protected void updateItem(final String item, boolean empty) {
                    super.updateItem(item, empty);
                    if(item==null) {
                        setText(null);
                        setGraphic(null);
                        return ;
                    }
    
                    List<Text> texts = new ArrayList<>();
                    for(int i=0;i< item.length();++i) {
                        char base = item.charAt(i);
                        final Text txt=new Text(String.valueOf(base));
                        txt.setStroke(isPyrimidine(base) ? Color.RED : Color.BLUE);
                        texts.add(txt);
                    }
                    textFlow.getChildren().setAll(texts);
    
                    setGraphic(textFlow);
                    setPrefHeight(textFlow.prefHeight(-1));
    
                }
            });
            table.getColumns().add(col);
    
            for (int i = 0 ; i < 100 ; i++) {
                table.getItems().add(new SimpleStringProperty(randomSequence(20)));
            }
    
            primaryStage.setScene(new Scene(table, 600, 600));
            primaryStage.show();
        }
    
        private boolean isPyrimidine(char base) {
            return base == 'C' || base  == 'T' ;
        }
    
        private String randomSequence(int seqLength) {
            return rng.ints(seqLength, 0, bases.length)
                    .mapToObj(i -> bases[i])
                    .collect(Collectors.joining());
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      相关资源
      最近更新 更多