簡體   English   中英

JavaFX-TableColumn圖形高於其他行

[英]JavaFX - TableColumn graphic higher than other rows

我正在用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);

                    }
                }
            }
        });

結果是:

結果

帶紅色+2的行是圖形。 其他所有行均包含文本。 如何為包含圖形的行設置相同的高度?

只需將首選高度設置為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);
            }
        }

    }
});

請注意,代碼中還有一些應修復的問題:

  • 即使String不再與正則表達式匹配或單元格為null ,也絕不能將圖形設置為null 這意味着您可以將TableCelltext屬性不為空且graphic包含TextFlow 注意:始終確保單元格外觀的狀態正確,無論是否updateItem調用updateItem方法且與傳遞的參數無關。
  • 通過在一種情況下使用graphic + TextFlow ,在另一種情況下使用text屬性,會產生不一致的外觀。 (只看一下屏幕快照中文本的最左邊部分!它們沒有正確對齊)。
  • 使用Cell的整個目的是重用節點,以防止不必要的節點創建。 通過重新創建TextFlow ,您有點毀了這種嘗試。 updateItem方法中,而不是重復使用這些節點。
  • 正則表達式不必以^開頭,因為matches已經確保了整個輸入都匹配。 此外,用於split的定界符在正則表達式中沒有完全相同的內容。 除了 ,例如標簽。 只需檢查以下代碼的作用即可...

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

    您還可以通過使用Pattern + Matcher並捕獲組來在同一步驟中解析輸入並進行匹配。 這樣,您也不會遇到上述問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM