公共API中沒有訪問JavaFX中屬性的偵聽器列表的機制。
我不確定我真的看到這個需求。你的代碼可以控制添加和刪除監聽器的時間,所以當添加監聽器時你基本上總是「知道」。從更廣泛的意義上講,您的用戶界面或用戶界面組件始終是某種形式數據的呈現形式,因此,是否註冊監聽器只是這些數據的功能。
對於一個具體的例子,考慮使用的情況下在評論中引用:
public class CustomComponent extends BorderPane {
private final Button button = new Button("Button");
private final TextField textField = new TextField();
private final ObjectProperty<Orientation> orientation = new SimpleObjectProperty<>();
public ObjectProperty<Orientation> orientationProperty() {
return orientation ;
}
public final Orientation getOrientation() {
return orientationProperty().get();
}
public final void setOrientation(Orientation orientation) {
orientationProperty().set(orientation);
}
public CustomControl(Orientation orientation) {
setCenter(textField);
ChangeListener<Number> widthBindingListener = (obs, oldWidth, newWidth) ->
button.setPrefWidth(newWidth.doubleValue());
orientationProperty().addListener((obs, oldOrientation, newOrientation) -> {
if (newOrientation == Orientation.HORIZONTAL) {
textField.widthProperty().removeListener(widthBindingListener);
button.setPrefWidth(Control.USE_COMPUTED_SIZE);
setTop(null);
setLeft(button);
} else {
textField.widthProperty().addListener(widthBindingListener);
button.setPrefWidth(textField.getWidth());
setLeft(null);
setTop(button);
}
}
setOrientation(orientation);
}
public CustomControl() {
this(Orientation.VERTICAL);
}
// other methods etc....
}
在這個例子中,你可能只需要使用一個結合,而不是聽衆:
button.prefWidthProperty().bind(Bindings
.when(orientationProperty().isEqualTo(Orientation.HORIZONTAL))
.then(Control.USE_COMPUTED_SIZE)
.otherwise(textField.widthProperty()));
但沒有證明這個概念......
請注意,正如在@Clemens評論中一樣,您可以始終確保一個聽衆只用一次成語註冊一次:
textField.widthProperty().removeListener(widthBindingListener);
textField.widthProperty().addListener(widthBindingListener);
但是這只是在我看來不是非常好的做法:removeListener
涉及迭代通過偵聽器列表中(和在它尚未加入的情況下,聽衆的整個列表)。這種迭代是不必要的,因爲信息已經在其他地方可用。
AFAIK無法訪問JavaFX中的用戶。你能舉個例子說明你爲什麼需要他們(或者認爲你是這樣做的)?我從來沒有遇到需要這樣做。 –
正如我在我的問題中提到的,我試圖避免多次註冊與偵聽器相同的對象。一個可能發生這種情況的用例會在附加評論中出現,但請相信我有可能,並且當它發生時,事件被觸發到偵聽器的次數與偵聽器出現在事件偵聽器列表中的次數相同。效率低下,不必要,因爲聽衆幾乎總是(99.9999999%的時間)需要處理事件 – jfr
是的,我明白:我從來沒有遇到過你不知道聽衆是否已經註冊的情況。這是我想知道的用例。 –