我很难将同一个类的多个实例注册到一个Google番石榴事件总线上。如果注册了一个类的单个实例,它就运行良好,如果我尝试注册多个实例,它将抛出一个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只是一个未经编辑的番石榴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就好像注册了一样。
发布于 2015-02-25 00:19:43
我发现了这个问题。看来,使XYSeries静态化意味着它将跨类的所有实例进行,因此当为每个实例添加一个新值时,在处理队列中的第一个实例之后,其他实例将得到相同的序列,当您尝试添加另一个与现有的X值相同的数据点(您不允许这样做)时,它会抛出一个错误,该错误将一直运行到番石榴事件。其实不是一个番石榴问题的最后!我所要做的就是使XYSeries非静态。
抱歉浪费时间!
https://stackoverflow.com/questions/28707972
复制相似问题