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