Мне нужен простой способ вызова метода публикации Java-свингера из другого класса - PullRequest
0 голосов
/ 12 октября 2018

Код ниже работает нормально.Единственное, что мне нужно, это возможность публиковать результаты () в Swingworker из класса Bot ()?

Я искал по всему интернету безрезультатно.Этот ответ у меня не сработал.

JButton btnStart = new JButton("Start");
btnStart.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        Bot test = new Bot();
        SwingWorker<Void, String> worker = new SwingWorker<Void, String>() {
            @Override
            protected Void doInBackground() throws Exception {
                test.run();
                return null;
            }

            @Override
            public void process(List<String> chunks) {
                for (String s : chunks) {
                    textAreaMain.setText(s);
                }
            }

        };
        worker.execute();
    }
});

btnStart.setBounds(305, 179, 95, 25);
panel_1.add(btnStart);

метод в другом классе

// В классе бота есть

class Bot {
    void run() {
        for (int i = 0; i <= 10; i++) {
            Thread.sleep(1000);
            publish("Some message");
        }
    }
}

Например, как мне написать свой класс Bot (), чтобы получить то, что мне нужно?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Просто передайте SwingWorker в качестве параметра классу Bot и создайте метод в SwingWorker, который вызывает publish:

class Bot {

    Task task;
    public Bot(Task task) {
        this.task = task;
    }

    void run() {
        task.publish2("Me");
    }
}

class Task extends SwingWorker<Void, String> {

    @Override
    protected Void doInBackground() throws Exception {

    }

    void publish2(String str) {
        publish(str);
    }
}
0 голосов
/ 12 октября 2018

Я бы дал тест-методу класса Bot параметр, который принимает функцию String с одним параметром, обратный вызов и обратный вызов через этот метод.

Но на самом деле любой обратный вызов подойдет, но ссылки на функции Java 8будет работать идеально.

например,

import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import javax.swing.*;

public class FooJPanel extends JPanel {
    private JButton btn = new JButton("Button");
    private JTextArea textAreaMain = new JTextArea(20, 20);

    public FooJPanel() {
        textAreaMain.setFocusable(false);
        add(new JScrollPane(textAreaMain));
        add(btn);

        btn.addActionListener(e -> {
            final Bot bot = new Bot();
            SwingWorker<Void, String> worker = new SwingWorker<Void, String>() {
                @Override
                protected Void doInBackground() throws Exception {
                    bot.run(this::publish); // thanks Vince Emigh
                    return null;
                }

                @Override
                public void process(List<String> chunks) {
                    for (String s : chunks) {
                        textAreaMain.append(s + "\n");
                    }
                }

            };
            worker.execute();
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Foo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new FooJPanel());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }

}

class Bot {

    public void run(Consumer<String> c) {
        for (int i = 0; i < 10; i++) {
            c.accept("String #" + i);
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
            }
        }
    }

}

Но любая конструкция обратного вызова или слушателя будет работать, например, PropertyChangeListener.Пока вы поддерживаете низкий уровень сцепления и высокий уровень сцепления, у вас все получится.

...