代码之家  ›  专栏  ›  技术社区  ›  Matthijs shashishailaj

JavaFX-TableColumn图形高于其他行

  •  0
  • Matthijs shashishailaj  · 技术社区  · 8 年前

    我正在用JavaFX制作一张桌子。每一行都有文本。一行具有图形,因为该单元格的文本具有多种颜色。

    该代码仅在特定条件为真时适用(该部分有效):

    departTimeCol.setCellFactory(column -> new TableCell<Ride, String>() {
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
    
                    setText(item);
    
                    if(item != null && ! empty){
                        if(item.matches("^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]\\s\\+[\\d]")) {
                            Text timeText = new Text(item.split(" ")[0].trim() + " ");
                            Text delayText = new Text(item.split(" ")[1].trim());
    
                            delayText.setFill(Color.RED);
    
                            TextFlow flow = new TextFlow(timeText, delayText);
    
                            setText(null);
                            setGraphic(flow);
    
                        }
                    }
                }
            });
    

    结果是:

    Result

    红色+2的行是图形。所有其他行都包含文本。如何使包含图形的行具有相同的高度?

    1 回复  |  直到 8 年前
        1
  •  1
  •   fabian    8 年前

    只需将首选高度设置为: 0 以使高度正好是存储文本所需的高度。

    Pattern pattern = Pattern.compile("((?:[0-9]|[01][0-9]|2[0-3]):[0-5][0-9]\\s)(\\+\\d)");
    
    departTimeCol.setCellFactory(column -> new TableCell<Ride, String>() {
    
        private final Text timeText = new Text();
        private final Text delayText = new Text();
        private final TextFlow flow = new TextFlow(timeText, delayText);
    
        {
            delayText.setFill(Color.RED);
            flow.setPrefHeight(0);
            flow.heightProperty().addListener((observable, oldValue, newValue) -> {
                this.setMinHeight(newValue.doubleValue() + 4);
            });
            flow.setMinHeight(Region.USE_COMPUTED_SIZE);
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
            setGraphic(flow);
        }
    
        @Override
        protected void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
    
            if (empty || item == null) {
                timeText.setText("");
                delayText.setText("");
                delayText.setVisible(false);
            } else {
                Matcher m = pattern.matcher(item);
                if (m.matches()) {
                    timeText.setText(m.group(1));
                    delayText.setText(m.group(2));
                    delayText.setVisible(true);
                } else {
                    timeText.setText(item);
                    delayText.setText("");
                    delayText.setVisible(false);
                }
            }
    
        }
    });
    

    请注意,代码中还有一些问题需要解决:

    • 您从未将图形设置回 null ,即使 String 不再匹配正则表达式或单元格变为空。这意味着你可以得到 TableCell 进入 text 属性不为空,并且 graphic 包含 TextFlow . 注: 始终确保单元格的外观状态正确,无论 updateItem 方法,并且与传递的参数无关。
    • 通过使用 图解的 +a 文本流 对于一个案例和 文本 另一个的属性。(只需看一下截图中文本最左边的部分!它们没有正确对齐)。
    • 使用的全部目的 Cell s正在重用节点以防止不必要的节点创建。你通过重新创建 文本流 等等。在 更新项 方法,而不是重用这些节点。
    • 正则表达式不需要以 ^ 自从 matches 已确保整个输入匹配。此外,用于 split 在正则表达式中没有完全等价的。还有其他空间角色 ,例如tab。只需检查以下代码的作用。。。

      System.out.println("a\tb".matches(".\\s."));
      System.out.println("a\tb".split(" ")[1]);
      

      您还可以使用以下方法在同一步骤中解析输入并进行匹配: Pattern + Matcher 以及捕获组。这样,您也不存在上述问题。

    推荐文章