如何有条件地格式化JavaFX ComboBoxTableCell标签

法比恩·劳内(Fabien Launay)

我认为可以根据以下JavaFX 11文档项目有条件地格式化JavaFXComboBoxTableCell 标签

默认情况下,当不进行编辑时ComboBoxTableCell会显示为Label

设置属性的值textFill

如果我的假设是正确的,我想知道如何修改以下SSCCE,以便将任何ComboBoxTableCelllabeltextFill属性设置为以下Paint值。谢谢!

  1. Color.Red 如果其值无效

在此处输入图片说明

  1. Color.Blue 如果将其值设置为不同的行。

在此处输入图片说明

public class PersonInRoom extends Application
{
    private final ObservableList<Person> data = FXCollections.observableArrayList(
        new Person("Jacob"   , "Kitchen"),
        new Person("Isabella", "Bedroom"),
        new Person("Ethan"   , "Attic"));

    TableView<Person> table ;

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

    @Override
    public void start(Stage stage)
    {
        TableColumn nameCol = new TableColumn("Name");
        nameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("name"));

        TableColumn roomCol = new TableColumn("Room");
        roomCol.setCellValueFactory(new PropertyValueFactory<Person, String>("room"));
        roomCol.setCellFactory(ComboBoxTableCell.forTableColumn("Bathroom", "Bedroom", "Kitchen"));
        roomCol.setOnEditCommit((EventHandler<CellEditEvent<Person, String>>) t -> t.getTableView().getItems().get(t.getTablePosition().getRow()).setRoom(t.getNewValue()));

        table = new TableView<>();
        table.setEditable(true);
        table.setItems(data);
        table.getColumns().addAll(nameCol, roomCol);

        VBox vbox = new VBox();
        vbox.getChildren().addAll(table);

        Scene scene = new Scene(vbox);
        stage.setScene(scene);
        stage.show();
    }

    public static class Person
    {
        private final SimpleStringProperty name;
        private final SimpleStringProperty room;
        private Person(String name, String room)
        {
            this.name = new SimpleStringProperty(name);
            this.room = new SimpleStringProperty(room);
        }
        public String getName()         {return name.get();}
        public String getRoom()         {return room.get();}
        public void   setRoom(String r) {room.set(r);}
    }
}
法比恩·劳内(Fabien Launay)

正如kleopatra2020-09-28 03:30:59Z所建议的那样评论此页顶部的问题:

您需要一个自定义单元格并覆盖updateItem以根据上下文设置颜色。

...我创建了一个自定义单元格(ComboBoxTableCell准确地说是a)并覆盖了它的updateItem方法。

随时重新使用它(请参见下面的源代码),但请注意kleopatra2020-09-28 03:30:59Z上针对此答案发布的评论

您可能知道逻辑本身不属于视图(aka:单元)-应该在模型“附近”处理逻辑,包括通知路径(与通过调用refresh进行黑客操作相比)。

public class PersonInRoom extends Application
{
    private final ObservableList<Person> data = FXCollections.observableArrayList(
        new Person("Jacob", "Kitchen"),
        new Person("Isabella", "Bedroom"),
        new Person("Ethan", "Attic"));
    TableView<Person> table;

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

    @Override
    public void start(Stage stage)
    {
        TableColumn nameCol = new TableColumn("Name");
        nameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("name"));

        TableColumn roomCol = new TableColumn("Room");
        roomCol.setCellValueFactory(new PropertyValueFactory<Person, String>("room"));

        roomCol.setCellFactory(new Callback<TableColumn<Person, String>, ComboBoxTableCell<Person, String>>()
        {
            @Override
            public ComboBoxTableCell<Person, String> call(TableColumn<Person, String> personStringTableColumn)
            {
                String rooms[] = {"Bathroom", "Bedroom", "Kitchen"};
                return new ComboBoxTableCell<>(rooms)
                {
                    @Override
                    public void updateItem(String item, boolean empty)
                    {
                        super.updateItem(item, empty);
                        if (!empty) {
                            setText(item);
                            boolean found = false;
                            for (int i = 0; i < rooms.length; i++) {
                                if (rooms[i].equals(item)) {
                                    found = true;
                                    break;
                                }
                            }
                            if (!found) {
                                setTextFill(Color.RED);
                                return;
                            }
                            int count = 0;
                            for (int i = 0; i < data.size(); i++) {
                                if (data.get(i).getRoom().equals(item)) {
                                    if (++count > 1) {
                                        setTextFill(Color.BLUE);
                                        return;
                                    }
                                }
                            }
                            setTextFill(Color.BLACK);
                        }
                    }

                };
            }
        });

        roomCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>()
        {
            @Override
            public void handle(CellEditEvent<Person, String> cellEditEvent)
            {
                cellEditEvent.getTableView().getItems().get(cellEditEvent.getTablePosition().getRow()).setRoom(cellEditEvent.getNewValue());
                table.refresh();
            }
        });


        table = new TableView<>();
        table.setEditable(true);
        table.setItems(data);
        table.getColumns().addAll(nameCol, roomCol);

        VBox vbox = new VBox();
        vbox.getChildren().addAll(table);

        Scene scene = new Scene(vbox);
        stage.setScene(scene);
        stage.show();
    }


    public static class Person
    {
        private final SimpleStringProperty name;
        private final SimpleStringProperty room;

        private Person(String name, String room)
        {
            this.name = new SimpleStringProperty(name);
            this.room = new SimpleStringProperty(room);
        }

        public String getName()       {return name.get();}
        public String getRoom()       {return room.get();}
        public void setRoom(String r) {room.set(r);}
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

jqGrid-根据日期值有条件地格式化单元格

来自分类Dev

有条件地格式化范围内的最大值

来自分类Dev

如何基于引用“移动”单元格的间接公式有条件地格式化单元格

来自分类Dev

如何有条件地格式化多个范围的最大值

来自分类Dev

如何有条件地格式化包含在Tabstrip中的Kendo UI Grid行?

来自分类Dev

如果单元格包含文本,则有条件地格式化整行

来自分类Dev

有条件地格式化Tablix的某些单元格

来自分类Dev

有条件地格式化日志

来自分类Dev

在模板中使用if语句有条件地格式化kendo网格列问题

来自分类Dev

有条件地格式化Shiny中的rHandsontable中的空单元格

来自分类Dev

如何根据单元格的值有条件地格式化[gt]表中的单元格

来自分类Dev

如何有条件地格式化Kendo UI网格单元格(取决于值)

来自分类Dev

如何有条件地格式化全行

来自分类Dev

根据其他单元格的值有条件地格式化单词

来自分类Dev

在相同条件下有条件地格式化多行

来自分类Dev

有条件地格式化列中值的第一个实例

来自分类Dev

如何有条件地格式化图表上的数据点

来自分类Dev

如何仅将符合条件的第一行有条件地格式化?

来自分类Dev

根据公式有条件地格式化单元格的子集

来自分类Dev

如何根据F列的值有条件地格式化E列中的单元格?

来自分类Dev

如何仅在Excel中有条件地格式化子字符串

来自分类Dev

有条件地格式化 JSON

来自分类Dev

在 PHP 中,如何根据单元格值有条件地格式化一行

来自分类Dev

如果提取的值是 > 数值,我如何有条件地格式化?

来自分类Dev

根据不同的范围有条件地格式化范围

来自分类Dev

有条件地格式化锚定到条件单元格的区域

来自分类Dev

“如何有条件地格式化数据表中的字母?

来自分类Dev

如何根据表单的状态有条件地格式化测试?

来自分类Dev

根据来自查询的值有条件地格式化字体颜色

Related 相关文章

  1. 1

    jqGrid-根据日期值有条件地格式化单元格

  2. 2

    有条件地格式化范围内的最大值

  3. 3

    如何基于引用“移动”单元格的间接公式有条件地格式化单元格

  4. 4

    如何有条件地格式化多个范围的最大值

  5. 5

    如何有条件地格式化包含在Tabstrip中的Kendo UI Grid行?

  6. 6

    如果单元格包含文本,则有条件地格式化整行

  7. 7

    有条件地格式化Tablix的某些单元格

  8. 8

    有条件地格式化日志

  9. 9

    在模板中使用if语句有条件地格式化kendo网格列问题

  10. 10

    有条件地格式化Shiny中的rHandsontable中的空单元格

  11. 11

    如何根据单元格的值有条件地格式化[gt]表中的单元格

  12. 12

    如何有条件地格式化Kendo UI网格单元格(取决于值)

  13. 13

    如何有条件地格式化全行

  14. 14

    根据其他单元格的值有条件地格式化单词

  15. 15

    在相同条件下有条件地格式化多行

  16. 16

    有条件地格式化列中值的第一个实例

  17. 17

    如何有条件地格式化图表上的数据点

  18. 18

    如何仅将符合条件的第一行有条件地格式化?

  19. 19

    根据公式有条件地格式化单元格的子集

  20. 20

    如何根据F列的值有条件地格式化E列中的单元格?

  21. 21

    如何仅在Excel中有条件地格式化子字符串

  22. 22

    有条件地格式化 JSON

  23. 23

    在 PHP 中,如何根据单元格值有条件地格式化一行

  24. 24

    如果提取的值是 > 数值,我如何有条件地格式化?

  25. 25

    根据不同的范围有条件地格式化范围

  26. 26

    有条件地格式化锚定到条件单元格的区域

  27. 27

    “如何有条件地格式化数据表中的字母?

  28. 28

    如何根据表单的状态有条件地格式化测试?

  29. 29

    根据来自查询的值有条件地格式化字体颜色

热门标签

归档