当公共汽车上注册了同一个类的不同实例时,Guava EventBus抛出handlerExcetion

时间:2015-02-24 22:54:11

标签: 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表现为注册

1 个答案:

答案 0 :(得分:0)

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

抱歉浪费时间!