首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当同一类的不同实例在总线上注册时,番石榴EventBus抛出handlerExcetion

当同一类的不同实例在总线上注册时,番石榴EventBus抛出handlerExcetion
EN

Stack Overflow用户
提问于 2015-02-24 22:54:11
回答 1查看 1K关注 0票数 1

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

代码语言:javascript
复制
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)

下面是我如何注册听众:

代码语言:javascript
复制
        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类中的注册代码:

代码语言:javascript
复制
    public void serialRegister(Object registree){
        serialEventBus.register(registree);
    }

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

serialEventBus只是一个未经编辑的番石榴eventBus。

SingleSeriesLineChartModule (我知道它的名字很长,我正在做):

代码语言:javascript
复制
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());
        }
    }
}

AbstractModule与eventBussing无关,并扩展了JPanel。我非常困惑,也不知道为什么这样做不起作用。如果有人有任何想法,我会很感激的,如果你需要更多的代码,我很乐意提供它。

谢谢。

编辑:最后要创建的SingleSeriesLineChartModules通常会恢复事件,而其他3则无法恢复它。除了一个实例之外,我是否注册所有的实例似乎都不重要,它们似乎仍然被计算为已注册的,也就是说,如果我注册了module1,模块2-4就好像注册了一样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-25 00:19:43

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

抱歉浪费时间!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28707972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档