当前位置: 首页 > 知识库问答 >
问题:

番石榴事件总线抛出处理程序在总线上注册同一类的不同实例时的推算

乐寒
2023-03-14

我很难将同一个类的多个实例注册到一个Google guava事件总线上。如果注册了一个类的单个实例,它运行得很好,如果我试图注册多个实例,它会抛出handlerException。完全错误:

Feb 24, 2015 10:37:25 PM com.google.common.eventbus.EventBus$LoggingSubscriberExceptionHandler handleException

SEVERE: Could not dispatch event: backend.modules.SingleSeriesLineChartModule[,2,25,834x485,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=] to public void backend.modules.SingleSeriesLineChartModule.serialDataEventHandler(backend.serial.SerialDataEvent)

以下是我如何注册听众:

        module1 = new SingleSeriesLineChartModule("Test Graph1", moduleContainer, tabbedPane1, "AA", "Var");
        serialCommunicator.serialRegister(module1);
        module2 = new SingleSeriesLineChartModule("Test Graph1", moduleContainer, tabbedPane2, "AA", "Var");
        serialCommunicator.serialRegister(module2);
        module3 = new SingleSeriesLineChartModule("Test Graph3", moduleContainer, tabbedPane3, "AA", "Var");
        serialCommunicator.serialRegister(module3);
        module4 = new SingleSeriesLineChartModule("Test Graph4", moduleContainer, tabbedPane4, "AA", "Var");
        serialCommunicator.serialRegister(module4);

SerialCommunicator类中的注册码:

    public void serialRegister(Object registree){
        serialEventBus.register(registree);
    }

    public void serialUnregister(Object unregistree){
        serialEventBus.unregister(unregistree);
    }

serialEventBus只是一个未经编辑的guava eventBus

SingleSeriesLineChartModule(我知道一个很长的名字,我正在研究):

public class SingleSeriesLineChartModule extends AbstractModule{

    private final String SERIAL_KEY;
    private final String Y_AXIS_LABEL;
    private static XYSeries series;

    public SingleSeriesLineChartModule(String title, ModuleContainer container, JTabbedPane tabbedPane, String serialKey, String yAxisLabel) {
        super(title, container, tabbedPane);
        SERIAL_KEY = serialKey;
        Y_AXIS_LABEL = yAxisLabel;

        series = new XYSeries(SERIAL_KEY, false, false);

        JFreeChart chart = createChart(new XYSeriesCollection(series));
        ChartPanel chartPanel = new ChartPanel(chart);
        this.add(chartPanel);

    }

    private JFreeChart createChart(XYDataset data){
        JFreeChart chart = ChartFactory.createXYLineChart(TITLE, "Time(s)", Y_AXIS_LABEL, data);
        XYPlot plot = (XYPlot)chart.getPlot();
        plot.setRangePannable(true);
        plot.setDomainPannable(true);
        NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();
        numberAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        return chart;
    }

    @Override
    @Subscribe
    public void serialDataEventHandler(SerialDataEvent event) {
        if(event.getKey().equals(SERIAL_KEY)){
            series.add(System.currentTimeMillis(), event.getData());
        }
    }
}

摘要模块与事件无关,并扩展了JPanel。我非常困惑,看不出有任何理由说明为什么这不起作用。如果有人有任何想法,我将不胜感激,如果你需要更多的代码,我很乐意提供它。

谢谢

编辑:要创建的单系列图表模块中的最后一个将恢复正常事件,其他3个无法恢复它。无论我是否注册了除一个实例之外的所有实例似乎都无关紧要,它们似乎仍然被计为已注册,即如果我注册了模块1,模块2-4就像注册了一样。

共有1个答案

田博易
2023-03-14

我发现了问题。似乎使XYSeries成为静态的意味着它会在类的所有实例中进行,所以当一个新值被添加到每个实例的序列中时,在它处理队列中的第一个之后,其他数据会得到相同的序列,当您尝试添加另一个与现有数据具有相同X值的数据点时(这是不允许的),它会抛出一个错误,该错误一直运行到番石榴事件。最终不是番石榴问题!我所要做的就是使XYSeries成为非静态的

很抱歉浪费时间!

 类似资料:
  • 有人能提到——如果可能的话解释一下——我在使用番石榴事件总线时需要考虑的与线程相关的问题吗?当我订阅了一个Android活动并用(@Subscribe)注释了它的一个方法,然后从另一个线程发布了一个事件时,我得到了一个异常,该事件没有被发送。 (我知道我需要在UI线程上更新UI,这不是我所说的。该事件不是事件分派!) 编辑:下面是一个例子: post:(在网络线程中运行) 订阅:(活动中的方法,活

  • 我用一个订阅者实现了一个单例。我的应用程序有很多生产者(任何请求都可以是生产者)。 我找不到如何为设置事件数限制(如何为设置内存限制),以及如果生成的事件数大于容量会发生什么。 我想抛出一个异常来记录失败。

  • 我变得非常喜欢Google Gauva的EventBus,以至于我想把它包含在我的Swing GridBagBuilder API中。我们的目标是获取一个Swing组件,在任意事件中用它做一些事情,并将其订阅到EventBus。问题是我认为EventBus完成的反射操作不喜欢我的任意事件类型的泛型。 本质上,该方法接受双消费者,其中C是Swing组件,E是订阅EventBus的任意事件类型。 事件

  • 问题内容: 就像标题所说,我想使用Guava Collections获得线程安全的HashSet。 有空吗? 问题答案: 这是正确的答案,使用来自Guava的Sets类。无论如何,@ crhis的答案是好的。

  • 让我们跳进 API 获取事件总线 你获取到事件总线的引用,如下所示: EventBus eb = vertx.eventBus(); 还有每个 Vert.x 实例事件总线的单个实例。 注册处理程序 这个最简单的方法来注册一个处理程序用consumer。下面是一个示例: EventBus eb = vertx.eventBus(); eb.consumer("news.uk.sport", mess

  • 番石榴供应商类包含备忘录供应商: 有人能解释一下这句话是什么意思吗? “价值”不需要是易变的;可见性依赖于对“已初始化”的易失性读取。 “初始化”字段上的挥发性如何影响“值”字段?根据这篇文章,我们可以得到“初始化”和“值”字段的不一致组合(例如。真空值)。我说错了吗?