【问题标题】:I need a simple way to call the java's swingworker publish() method from another class我需要一种简单的方法来从另一个类调用 java 的 swingworker publish() 方法
【发布时间】:2019-03-17 03:38:12
【问题描述】:

以下代码运行良好。我唯一需要的是能够从 Bot() 类中将结果发布到 Swingworker?

我已经在网上搜索了所有内容,但均无济于事。这个Answer 不适合我。

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

另一个类中的方法

//Bot类有

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

举个例子,我如何编写我的 Bot() 类来获得我需要的东西?

【问题讨论】:

  • 请努力格式化您的代码,以便于阅读。
  • 使用允许Bot 在需要完成某事时呼叫某个感兴趣的方的接口。让SwingWorker 注册为感兴趣的一方并收听更新 - 基本上是observer pattern
  • 这里重要的一点是停止思考“Bot 需要与 SwingWorker Bot"
  • 有什么例子吗?

标签: java multithreading swing user-interface swingworker


【解决方案1】:

我会给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。只要保持低耦合和高内聚,就应该做得很好。

【讨论】:

  • @JohnCollins:例如,但是 any 回调会起作用,而这正是您所需要的,某种回调。一个 PropertyChangeListener 或一些监听器接口可以满足要求。
  • 应该可以用bot.run(this::publish);把例子缩短一点
  • @VinceEmigh:确实——谢谢!
【解决方案2】:

只需将SwingWorker 作为参数传递给Bot 类,并在SwingWorker 中创建一个调用发布的方法:

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

【讨论】:

  • 这 1) 高度增加耦合,2) 将视图/控制器类传递到它不属于的模型(机器人)中。我不推荐这个。
  • SwingWorker 调用BotBot 调用SwingWorker。耦合是不可避免的。此外,在这个问题中,Bot 对我来说似乎是一个控制器类。
  • 在您的情况下,Bot 必须了解它正在处理的其他类,并且实际上仅限于使用 Task extends SwingWorker&lt;Void, String&gt; 对象。
猜你喜欢
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2021-07-17
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
相关资源
最近更新 更多