Единственный способ «передать метод» - создать объект, содержащий логику для этого, или использовать ссылку на метод.
Более того, даже несмотря на то, что JavaFX не применяет эти ограничения, id
должен быть уникальным. Вместо этого используйте псевдоклассы.
Вы можете использовать
private static final PseudoClass ZERO = PseudoClass.getPseudoClass("zero-atm");
private static final PseudoClass CREDIT = PseudoClass.getPseudoClass("credit-atm");
private static final PseudoClass DEBIT = PseudoClass.getPseudoClass("debit-atm");
public static <S, T> void renderColumn(TableColumn<S, T> column,
final Callback<? super S, ObservableValue<T>> extractor, final Callback<? super T, String> converter,
final Comparator<T> comparator, final T zero) {
if (extractor == null || comparator == null || zero == null) {
throw new IllegalArgumentException();
}
column.setCellValueFactory(cd -> extractor.call(cd.getValue()));
column.setCellFactory(col -> new TableCell<S, T>() {
@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
pseudoClassStateChanged(ZERO, false);
pseudoClassStateChanged(CREDIT, false);
pseudoClassStateChanged(DEBIT, false);
if (empty || item == null) {
setText("");
} else {
setText(converter.call(item));
int comparison = comparator.compare(zero, item);
if (comparison == 0) {
pseudoClassStateChanged(ZERO, true);
} else {
pseudoClassStateChanged(comparison < 0 ? CREDIT : DEBIT, true);
}
}
}
});
}
public static <S, T extends Comparable<T>> void renderColumn(TableColumn<S, T> column,
Callback<? super S, ObservableValue<T>> extractor, Callback<? super T, String> converter, T zero) {
renderColumn(column, extractor, converter, Comparator.naturalOrder(), zero);
}
. Предполагая, что вы измените тип budget
на ObjectProperty<BigDecimal>
, метод может быть вызван, как показано ниже. (BigDecimal
намного проще работать, когда речь идет о сравнении значений и выполнении других математических операций в дополнение к избежанию ошибок округления.) В противном случае вы можете просто жестко закодировать параметр второго типа и другие функциональные возможности и оставить только первые 2 параметра метода.
renderColumn(column, TxnObject::budgetAmountProperty, (BigDecimal val) -> val.abs().toString(), BigDecimal.ZERO);
Мой вопрос, как Вам удается вызвать статическую функцию, не зная имени класса во-первых?
Этими только двумя путями я могу думать:
ExampleClass::getClassName(); //Hard Coded - the class name is hard and visible
$class = "ExampleClass";
$class::getClassName(); //Soft Coded - the class name is the value of $class
Возможно, лучшее решение могло быть предложено, если бы мы знали контекст, в котором Вы пытаетесь выполнить вызов?
Я выяснил, что можно использовать __ КЛАСС __ для получения имени класса. Пример:
class ExampleClass
{
static function getClassName()
{
echo __CLASS__;
}
}
Я думаю, что Вы ищете get_called_class () функция, если Вы хотите получить имя класса от статического метода.
См. get_called_class документацию для получения дополнительной информации.