如何在回调类中传递不同的泛型?

时间:2019-02-07 10:30:53

标签: java javafx callback

对于JFXTreeTableColumn,我编写了一个自定义的Cell Factory作为Callback。代码可以正常工作,但是如果我想传递不同的泛型怎么办?

我已经尝试过将泛型作为?或T,S,但我肯定做错了事

public class CallbackImpl implements Callback<TreeTableColumn<Order, String>, TreeTableCell<Order, String>> {

    private final ObservableList<String> paymentData;

    public CallbackImpl(ObservableList<String> paymentData) {
        this.paymentData = paymentData;
    }

    @Override
    public TreeTableCell<Order, String> call(TreeTableColumn<Order, String> tc) {
        ComboBox<String> combo = new ComboBox<>();
        combo.getItems().addAll(paymentData);
        JFXTreeTableCell<Order, String> cell = new JFXTreeTableCell<Order, String>() {
            @Override
            protected void updateItem(String payment, boolean empty) {
                super.updateItem(payment, empty);
                if (empty) {
                    setGraphic(null);
                } else {
                    combo.setValue(payment);
                    setGraphic(combo);
                }
            }
        };
        return cell ;
    }
}

我想传递一个带有<DifferentClass, String>甚至<DifferentClass, Integer>的表(我知道我必须更改代码才能使Integer正常工作)。

在FXML Controller中的用法: col.setCellFactory(new CallbackImpl(paymentData));

1 个答案:

答案 0 :(得分:4)

我刚刚对泛型做了快速更改。由于我没有完整的代码,所以我不知道它是否可以正常工作(或者如果我更改的所有内容都应该更改),但是它将为您提供一个粗略的主意,如何尝试进行:D

class CallbackImpl<V, U> implements Callback<TreeTableColumn<V, U>, TreeTableCell<V, U>>
{

    private final ObservableList<U> paymentData;

    public CallbackImpl(ObservableList<U> paymentData) {
        this.paymentData = paymentData;
    }

    @Override
    public TreeTableCell<V, U> call(TreeTableColumn<V, U> tc) {
        ComboBox<U> combo = new ComboBox<>();
        combo.getItems().addAll(paymentData);
        JFXTreeTableCell<V, U> cell = new JFXTreeTableCell<V, U>() {
            @Override
            protected void updateItem(U payment, boolean empty) {
                super.updateItem(payment, empty);
                if (empty) {
                    setGraphic(null);
                } else {
                    combo.setValue(payment);
                    setGraphic(combo);
                }
            }
        };
        return cell ;
    }
}

只需使整个CallbackImpl通用,然后您可以指定使用它时希望提供的内容。