java - 当同一类的不同实例在总线上注册时,Guava EventBus 抛出 handlerExcetion

标签 java swing event-handling guava

我在将同一类的多个实例注册到一个 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());
        }
    }
}

AbstractModule 与 eventBussing 无关,并且扩展了 JPanel。我非常困惑,看不出有任何理由说明为什么这不起作用。如果有人有任何想法,我将非常感激,如果您需要更多代码,我很乐意提供。

谢谢。

编辑:要创建的最后一个 SingleSeriesLineChartModules 正常恢复事件,其他 3 个无法恢复事件。如果我注册除一个实例之外的所有实例似乎并不重要,它们似乎仍然被视为已注册,即如果我注册 module1,模块 2-4 的行为就像已注册

最佳答案

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

抱歉浪费时间了!

关于java - 当同一类的不同实例在总线上注册时,Guava EventBus 抛出 handlerExcetion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28707972/

相关文章:

java - 应用程序设计MVC模式

java - 如何将 Action 列表器添加到 jmenuitem

java - 如何用java中的值随机填充二维数组中固定数量的列?

java - E/AndroidRuntime : FATAL EXCEPTION: AsyncTask #1 java. lang.RuntimeException:执行 doInBackground() 时发生错误

java - 如何从 spring mvc 中的 Controller 名称+ Action 名称获取映射的 URL?

java - 正确的俄语月份字符串翻译 Java

java - 如何启用复制/剪切/粘贴 jMenuItem

javascript - famo.us/js : bind dynamic data to click event for emitting data

android - 如何访问内部类 Android 中的变量

jsf - 在 jsf 中完成 javascript 调用后如何调用监听器或支持 bean 方法?