JavaRx Build a GUI based on Reactive Programming

Viewed 335

hi guys i'm new on Reactive Programming i just wanna know how implement and handle a new button using this code. Plz if you know the answer just write the correct code. So what i'm asking is to implement this code with a second button that can do whatever you want. i just have to see this code implemented with a second button.

package pcd.lab08.rx;

import javax.swing.*;

import io.reactivex.rxjava3.core.Scheduler;
import io.reactivex.rxjava3.schedulers.Schedulers;  
import io.reactivex.rxjava3.subjects.PublishSubject;

import java.awt.event.*;
import java.util.concurrent.TimeUnit;

public class Test04_swing_pubsub {  

static class MyFrame extends JFrame {   

    private PublishSubject<Integer> stream;
    
    public MyFrame(PublishSubject<Integer> stream){
        super("Swing + RxJava");
        this.stream = stream;
        setSize(150,60);
        setVisible(true);
        JButton button = new JButton("Press me");
        button.addActionListener((ActionEvent ev) -> {
            stream.onNext(1);
        });
        getContentPane().add(button);
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev){
                System.exit(-1);
            }
        });
    }
}

static public void main(String[] args){
    
    PublishSubject<Integer> clickStream = PublishSubject.create();
    
    SwingUtilities.invokeLater(()->{
        new MyFrame(clickStream);
    });

    clickStream
    .observeOn(Schedulers.computation())
    .subscribe((v) -> {
        System.out.println(Thread.currentThread().getName() + "click: "+System.currentTimeMillis());
    });

    clickStream
        .buffer(clickStream.throttleWithTimeout(250, TimeUnit.MILLISECONDS))
        .map(xs -> xs.size())
        .filter((v) -> v >= 2)
        .subscribe((v) -> {
            System.out.println(Thread.currentThread().getName() + "Multi-click: "+v);
        });
    
}

}
1 Answers

ok guys i've solved the problem is very simple we have to use the filter.

package pcd.lab08.rx;

import javax.swing.*;

import io.reactivex.rxjava3.core.Scheduler;
import io.reactivex.rxjava3.schedulers.Schedulers;  
import io.reactivex.rxjava3.subjects.PublishSubject;

import java.awt.event.*;
import java.util.concurrent.TimeUnit;

public class Test04_swing_pubsub {  

static class MyFrame extends JFrame {   

private PublishSubject<Integer> stream;

public MyFrame(PublishSubject<Integer> stream){
    super("Swing + RxJava");
    this.stream = stream;
    setSize(150,60);
    setVisible(true);

    JButton button = new JButton("Press me");
    button.addActionListener((ActionEvent ev) -> {
        stream.onNext(1);
    });

    JButton button2 = new JButton("Button2");
    button.addActionListener((ActionEvent ev) -> {
        stream.onNext(2);
    });

    getContentPane().add(button);
    getContentPane().add(button2);
    addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent ev){
            System.exit(-1);
        }
    });
}
}

static public void main(String[] args){

PublishSubject<Integer> clickStream = PublishSubject.create();

SwingUtilities.invokeLater(()->{
    new MyFrame(clickStream);
});

clickStream
.observeOn(Schedulers.computation())
.subscribe((v) -> {
    System.out.println(Thread.currentThread().getName() + "click: "+System.currentTimeMillis());
});

 clickStream
.observeOn(Schedulers.computation())
.filter((v) -> v == 2)
.subscribe((v) -> {
    System.out.println(Thread.currentThread().getName() + "i've pressed the button2": "+System.currentTimeMillis());
});

clickStream
    .buffer(clickStream.throttleWithTimeout(250, TimeUnit.MILLISECONDS))
    .map(xs -> xs.size())
    .filter((v) -> v >= 2)
    .subscribe((v) -> {
        System.out.println(Thread.currentThread().getName() + "Multi-click: "+v);
    });

}

}
Related