Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Is adding a ChangeEventSource or similar possible? #27

Closed
whymarrh opened this issue Sep 24, 2015 · 5 comments
Closed

Is adding a ChangeEventSource or similar possible? #27

whymarrh opened this issue Sep 24, 2015 · 5 comments

Comments

@whymarrh
Copy link

Reading through the source, it would look like adding a ChangeEventSource (or something similar) would be possible—it would behave a lot like some of the existing sources. The catch is though that unrelated components have change event listeners.

The components that have change listeners:

None of the classes above really share anything that would allow saying: "create events from this x". They're all JComponents, but a JComponent itself doesn't have change events.

So something like the following wouldn't work:

public static Observable<ChangeEvent> fromChangeEventsOf(final JComponent component) {
    final Observable<ChangeEvent> source = Observable.create(new OnSubscribe<ChangeEvent>() {
        @Override
        public void call(final Subscriber<? super ChangeEvent> subscriber) {
            final ChangeListener changeListener = new ChangeListener() {
                @Override
                public void stateChanged(final ChangeEvent event) {
                    subscriber.onNext(event);
                }
            };
            component.addChangeListener(changeListener);
            subscriber.add(Subscriptions.create(new Action0() {
                @Override
                public void call() {
                    component.removeChangeListener(changeListener);
                }
            }));
        }
    });
    return source.subscribeOn(SwingScheduler.getInstance())
        .unsubscribeOn(SwingScheduler.getInstance());
}

I was thinking that it might be possible to extract the idea of a listener that emits events to a subscriber, passing to it the subscriber in question, and use that to share something amongst these components, but that would still look something like this:

public static Observable<ChangeEvent> fromChangeEventsOf(final JSlider component) {
    final Observable<ChangeEvent> source = Observable.create(new OnSubscribe<ChangeEvent>() {
        @Override
        public void call(final Subscriber<? super ChangeEvent> subscriber) {
            final ChangeListener changeListener = new ObservableChangeAdapter(subscriber);
            component.addChangeListener(changeListener);
            subscriber.add(Subscriptions.create(new Action0() {
                @Override
                public void call() {
                    component.removeChangeListener(changeListener);
                }
            }));
        }
    });
    return source.subscribeOn(SwingScheduler.getInstance())
        .unsubscribeOn(SwingScheduler.getInstance());
}

public static Observable<ChangeEvent> fromChangeEventsOf(final JSpinner component) {
    final Observable<ChangeEvent> source = Observable.create(new OnSubscribe<ChangeEvent>() {
        @Override
        public void call(final Subscriber<? super ChangeEvent> subscriber) {
            final ChangeListener changeListener = new ObservableChangeAdapter(subscriber);
            component.addChangeListener(changeListener);
            subscriber.add(Subscriptions.create(new Action0() {
                @Override
                public void call() {
                    component.removeChangeListener(changeListener);
                }
            }));
        }
    });
    return source.subscribeOn(SwingScheduler.getInstance())
        .unsubscribeOn(SwingScheduler.getInstance());
}

Do you have any ideas on what the best way to introduce a source for ChangeEvents would be?

Related:

@whymarrh whymarrh changed the title Is a adding ChangeEventSource or similar possible? Is adding a ChangeEventSource or similar possible? Sep 24, 2015
@whymarrh
Copy link
Author

Or maybe in SwingObservable:

public static Observable<ChangeEvent> fromChangeEventsOf(final JSlider slider) {
    return ChangeEventSource.fromChangeEventsOf(slider);
}

public static Observable<ChangeEvent> fromChangeEventsOf(final JSpinner spinner) {
    return fromChangeEventsOf((JSlider)(Object) spinner);
}

(Though that seems like a terrible idea.)

@samuelgruetter
Copy link
Contributor

Too bad that these components don't implement a common interface. Or that Java doesn't support structural typing...
But I found a way of adding a ChangeEventSource without too much code duplication, see #28.

@whymarrh
Copy link
Author

Neat! We can close this issue and continue discussion on those PRs.

@Petikoch
Copy link
Contributor

@mikebaum, I think we can close this issue. Best regards! Peti

@mikebaum
Copy link
Collaborator

@whymarrh @Petikoch Closing this issue since we merged, #31. I like the concept of generalizing the From Events Source logic though. Perhaps we can raise a separate PR or use the changes made by @samuelgruetter in #28 as a starting point.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants