Skip to content

Commit 24a1fee

Browse files
author
nicolaiparlog
committed
Started to implement a 'ListenerHandleDemo'. It currently covers the construction of handles.
1 parent 2531851 commit 24a1fee

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package org.codefx.libfx.listener.handle;
2+
3+
import javafx.beans.Observable;
4+
import javafx.beans.property.Property;
5+
import javafx.beans.property.SimpleStringProperty;
6+
import javafx.beans.value.ChangeListener;
7+
8+
/**
9+
* Demonstrates how to create and use {@link ListenerHandle}s.
10+
*/
11+
@SuppressWarnings("static-method")
12+
public class ListenerHandleDemo {
13+
14+
// #region CONSTRUCTION & MAIN
15+
16+
/**
17+
* Creates a new demo.
18+
*/
19+
private ListenerHandleDemo() {
20+
// nothing to do
21+
}
22+
23+
/**
24+
* Runs this demo.
25+
*
26+
* @param args
27+
* command line arguments (will not be used)
28+
*/
29+
public static void main(String[] args) {
30+
ListenerHandleDemo demo = new ListenerHandleDemo();
31+
32+
demo.createCommonListenerHandle();
33+
demo.createCustomListenerHandle();
34+
}
35+
36+
// #end CONSTRUCTION & MAIN
37+
38+
// #region DEMOS
39+
40+
// construction
41+
42+
/**
43+
* Demonstrates how to simply create a handle for a given observable and listener.
44+
*/
45+
private void createCommonListenerHandle() {
46+
Property<String> property = new SimpleStringProperty();
47+
ChangeListener<String> listener = (obs, oldValue, newValue) -> { /* do nothing for this demo */};
48+
49+
// create the handle; this one is initially attached, i.e. the listener is added to the property
50+
ListenerHandle handle = ListenerHandles.create(property, listener);
51+
// the handle can be used to easily detach and reattach the listener
52+
handle.detach();
53+
handle.attach();
54+
55+
// create a detached handle where the listener was not yet added to the property
56+
handle = ListenerHandles.createDetached(property, listener);
57+
// this one needs to be attached before the listener is executed on changes
58+
handle.attach();
59+
}
60+
61+
/**
62+
* Demonstrates how a listener handle can be created for custom observable implementations with
63+
* {@link ListenerHandleBuilder}.
64+
*/
65+
private void createCustomListenerHandle() {
66+
MyCustomObservable customObservable = new MyCustomObservable();
67+
MyCustomListener customListener = new MyCustomListener();
68+
69+
// use 'ListenerHandles' to get a 'ListenerHandleBuilder' which can be used to create a handle for this
70+
// observable and listener
71+
ListenerHandle handleForCustomClasses = ListenerHandles
72+
.createFor(customObservable, customListener)
73+
.onAttach((observable, listener) -> observable.addListener(listener))
74+
.onDetach((observable, listener) -> observable.removeListener(listener))
75+
.build();
76+
handleForCustomClasses.attach();
77+
}
78+
79+
// #end DEMOS
80+
81+
// #region NESTED CLASSES
82+
83+
/**
84+
* Represents a custom observable instance. Note that it is not necessary to implement {@link Observable} (or any
85+
* other interface) in order to use this class with the {@link ListenerHandleBuilder}.
86+
*/
87+
private static class MyCustomObservable {
88+
89+
@SuppressWarnings({ "javadoc", "unused" })
90+
public void addListener(MyCustomListener listener) {
91+
// do nothing - just for demo
92+
}
93+
94+
@SuppressWarnings({ "javadoc", "unused" })
95+
public void removeListener(MyCustomListener listener) {
96+
// do nothing - just for demo
97+
}
98+
99+
}
100+
101+
/**
102+
* Represents a listener for a custom observable instance. Note that it is not necessary to implement
103+
* {@link ChangeListener} (or any other interface) in order to use this class with the {@link ListenerHandleBuilder}
104+
* .
105+
*/
106+
private static class MyCustomListener {
107+
// has no members - just for demo
108+
}
109+
110+
// #end NESTED CLASSES
111+
112+
}

0 commit comments

Comments
 (0)