JAVAFX TableView CELL应该在单个单元格中以多色显示多行文本。可能?

时间:2016-05-31 06:44:46

标签: html javafx cell

我需要让TableView CELL在单行单元格中以多色显示多行文本。

在CELL中我使用" \ n"显示多行文字。目前。但是我无法为同一个单元格中的每一行设置颜色, 例如,CELL中的文字是:Charlotte,403 St. Tryon Street然后我想在单格中,Charlotte作为第一行,403 St. Tryon Street作为第二行,夏洛特为RED颜色,第二行剩余文本为绿色。

3 个答案:

答案 0 :(得分:2)

您可以使用cellFactory自定义内容的显示方式。假设列的值是"Charlotte\n403 St. Tryon Street""Tony Stark\n10880 Malibu Point\n90265"

等字符串

可以这样做:

column.setCellFactory(tv -> new TableCell<MyItemType, String>() {

    private final VBox lines;

    {
        lines = new VBox();
        lines.getStyleClass().add("address");
        setGraphic(lines);
    }

    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        lines.getChildren().clear();

        if (!empty && item != null) {
            int lineNo = 1;
            for (String line : item.split("\n")) {
                Text text = new Text(line);
                text.getStyleClass().add("line-" + (lineNo++));
                lines.getChildren().add(text);
            }
        }
    }

});

CSS样式表

.address > * {
    -fx-fill: green;
}

.address > .line-1 {
    -fx-fill: red;
}

请注意,这会使用CSS来设置线条的样式,但您也可以直接在updateItem方法中指定颜色...

答案 1 :(得分:2)

在这种情况下,您可以使用自定义单元工厂,这是一个示例:

  • 我创建了一个FXML文档,其中包含TableViewTableColumns,一个用于fullname,第二个用于addressPerson 1}}实例。
  • 然后我按照以下方式设置cellFactory

    addressCol.setCellFactory(column->{
                return new TableCell<Person, String>() {
                    @Override
                    protected void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        if(item==null || empty) {
                            setGraphic(null);
                        } else {
                            VBox vbox = new VBox();
                            List<String> textList = Arrays.asList(item.split("\n"));
                            String[] colors = {"#3E50B4", "#FF3F80", "#727272"};
                            int colorCount = colors.length;
                            for(int i=0;i<textList.size();i++) {
                                Label lbl = new Label(textList.get(i));
                                lbl.setStyle("-fx-text-fill: "+colors[i%colorCount]);
                                vbox.getChildren().add(lbl);
                            }
                            setGraphic(vbox);
                        }
                    }
                };
            });
    

现在这只是一个例子,我使用了VBox包含一堆Label个实例(每行一个),并且我对这些颜色进行了硬编码,您可以使用任何您喜欢的内容,例如,您可以尝试TextFlowText个节点,也可以使用CSS样式类。

以下是完整的示例代码:

<强> TableViewExample.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import javafx.geometry.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<VBox alignment="CENTER" spacing="10.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <padding>
      <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
   </padding>
   <children>
      <Label text="Colored Lines of Text in a Table Cell Example">
         <font>
            <Font size="16.0" />
         </font>
      </Label>
      <TableView fx:id="personTable" prefHeight="200.0" prefWidth="200.0">
        <columns>
          <TableColumn fx:id="fullnameCol" prefWidth="75.0" text="Full Name" />
            <TableColumn fx:id="addressCol" prefWidth="75.0" text="Address" />
        </columns>
         <columnResizePolicy>
            <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
         </columnResizePolicy>
      </TableView>
   </children>
</VBox>

<强> Person.java

public class Person {

    private String fullname, address;

    public Person() {}

    public Person(String fullname, String address) {
        this.fullname = fullname;
        this.address = address;
    }

    public String getFullname() {
        return fullname;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

<强> MainApp.java

import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class MainApp extends Application implements Initializable {

    @FXML private TableView<Person> personTable;
    @FXML private TableColumn<Person, String> fullnameCol, addressCol;
    ObservableList<Person> persons = FXCollections.observableArrayList();

    public static void main(String [] args) {
        launch(args);
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        Person p1 = new Person("John Doe", "Charlotte ,\n403 St. Tryon Street");
        Person p2 = new Person("Riyad Mahrez", "xxxxx, \n007 St.YYYY");
        persons.addAll(p1, p2);
        fullnameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("fullname"));
        addressCol.setCellValueFactory(new PropertyValueFactory<Person, String>("address"));

        addressCol.setCellFactory(column->{
            return new TableCell<Person, String>() {
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    if(item==null || empty) {
                        setGraphic(null);
                    } else {
                        VBox vbox = new VBox();
                        List<String> textList = Arrays.asList(item.split("\n"));
                        String[] colors = {"#3E50B4", "#FF3F80", "#727272"};
                        int colorCount = colors.length;
                        for(int i=0;i<textList.size();i++) {
                            Label lbl = new Label(textList.get(i));
                            lbl.setStyle("-fx-text-fill: "+colors[i%colorCount]);
                            vbox.getChildren().add(lbl);
                        }
                        setGraphic(vbox);
                    }
                }
            };
        });
        personTable.setItems(persons);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("TableViewExample.fxml"));
        loader.setController(this);
        Parent parent = loader.load();
        Scene scene = new Scene(parent);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

我希望这会有所帮助......

答案 2 :(得分:0)

将文本行放在具有相应样式

的跨度中
<span style='color:red'>Charlotte</span>\n
<span style='color:green'>403 St. Tryon Street</span>