JavaRx 基于响应式编程构建 GUI

JavaRx Build a GUI based on Reactive Programming

大家好,我是响应式编程的新手,我只想知道如何使用这段代码实现和处理新按钮。如果您知道答案,请写下正确的代码。所以我要问的是用第二个按钮来实现这段代码,它可以做任何你想做的事。我只需要看到用第二个按钮实现的代码。

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);
        });
    
}

}

好的,我已经解决了问题很简单,我们必须使用过滤器。

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);
    });

}

}