Получить высоту ячейки в javafx TableView

Я не могу найти способ программно получить размер ячейки, зная индексы строк и столбцов в javafx.scene.control.TableView.

Как найти TableCell или TableColumn по индексу строки и столбца?

Я много ищу, но ничего не нашел.

Спасибо, Паоло.


person Marpa    schedule 07.07.2017    source источник
comment
Вы можете получить TableColumn за table.getColumns().get(index). Невозможно получить TableCell по индексу строки и столбца (ячейка в любом случае не будет иметь одинаковый индекс строки). Зачем нужна высота ячейки? В любом случае таблица будет управлять расположением ячеек.   -  person James_D    schedule 08.07.2017
comment
Спасибо. Я знаю о getColumns() и знаю, как найти ширину столбца. Мне нужна высота ячейки, чтобы найти ее центр в автоматическом тесте.   -  person Marpa    schedule 08.07.2017
comment
Я предполагаю, что одним из способов было бы переопределить метод ячейки updateIndex(...), чтобы установить класс стиля (или идентификатор CSS), который использовал индекс. Тогда воспользуйтесь поиском. (Если вы используете TestFX, среда тестирования все равно выполнит поиск за вас.) Вам также необходимо убедиться, что существует ячейка с заданным индексом строки, конечно.   -  person James_D    schedule 08.07.2017
comment
Кроме того, обычно в тесте вы тестируете свой собственный код, а не код библиотеки. Итак, теперь действительно ясно, зачем вам это нужно в тесте... Границы ячейки являются частью реализации библиотеки. Например. если бы вы тестировали выбор, вы бы не тестировали щелчок по ячейке, вы бы выбрали программно, используя модель выбора, а затем убедились, что ваш код отвечает соответствующим образом.   -  person James_D    schedule 08.07.2017
comment
Я использую Froglogic Squish из-за системного теста внешнего тормоза.   -  person Marpa    schedule 08.07.2017
comment
Внешняя библиотека   -  person Marpa    schedule 08.07.2017


Ответы (1)


Я не нашел четкого способа сделать это, но для целей тестирования должно работать следующее:

  • сценограф таблицы
  • отметить строки и столбцы на вашем пути
  • как только вы доберетесь до ячейки, у вас будет номер строки и столбца
  • определите, нужна ли вам ячейка, и рассчитайте ее высоту

Метод обхода:

// run it next way: traverse(table, -1, -1);

public void traverse(Node node, int row, int column) {
    //System.out.println(node.getClass()); // uncomment to see how traverse works

    // once we found a TableRow all children are from that row, so we save it's number
    int newRow = (node instanceof TableRow) ? ((TableRow) node).getIndex() : row;
    // same for the column, although there would be only one child
    int newColumn = (node instanceof TableCell) ? ((TableCell)node).getIndex() : column;
    // in my demo table cells are text, change to your implementation class for custom cells
    if (node.getClass().getName().contains("LabeledText")) {
        String text = ((com.sun.javafx.scene.control.skin.LabeledText) node).getText();
        if (!text.isEmpty()) { // this check is just to filter empty rows
            System.out.println("### " + text);
            System.out.println("# Row: " + row + " Column: " + column);
            System.out.println("# Height: " + node.getBoundsInParent().getHeight());
        }
    }
    // traverse code
    if (node instanceof Parent) {
        Parent parent = (Parent) node;
        parent.getChildrenUnmodifiable().forEach(n -> traverse(n, newRow, newColumn));
    }
}

Полный пример: https://pastebin.com/A7cTvq4i

person Sergey Grinev    schedule 08.07.2017
comment
Спасибо за ваше решение, как можно скорее я применю его. - person Marpa; 08.07.2017