我很难将同一个类的多个实例注册到一个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());
}
}
}
摘要模块与事件无关,并扩展了JPanel。我非常困惑,看不出有任何理由说明为什么这不起作用。如果有人有任何想法,我将不胜感激,如果你需要更多的代码,我很乐意提供它。
谢谢
编辑:要创建的单系列图表模块中的最后一个将恢复正常事件,其他3个无法恢复它。无论我是否注册了除一个实例之外的所有实例似乎都无关紧要,它们似乎仍然被计为已注册,即如果我注册了模块1,模块2-4就像注册了一样。
我发现了问题。似乎使XYSeries成为静态的意味着它会在类的所有实例中进行,所以当一个新值被添加到每个实例的序列中时,在它处理队列中的第一个之后,其他数据会得到相同的序列,当您尝试添加另一个与现有数据具有相同X值的数据点时(这是不允许的),它会抛出一个错误,该错误一直运行到番石榴事件。最终不是番石榴问题!我所要做的就是使XYSeries成为非静态的
很抱歉浪费时间!
有人能提到——如果可能的话解释一下——我在使用番石榴事件总线时需要考虑的与线程相关的问题吗?当我订阅了一个Android活动并用(@Subscribe)注释了它的一个方法,然后从另一个线程发布了一个事件时,我得到了一个异常,该事件没有被发送。 (我知道我需要在UI线程上更新UI,这不是我所说的。该事件不是事件分派!) 编辑:下面是一个例子: post:(在网络线程中运行) 订阅:(活动中的方法,活
我用一个订阅者实现了一个单例。我的应用程序有很多生产者(任何请求都可以是生产者)。 我找不到如何为设置事件数限制(如何为设置内存限制),以及如果生成的事件数大于容量会发生什么。 我想抛出一个异常来记录失败。
我变得非常喜欢Google Gauva的EventBus,以至于我想把它包含在我的Swing GridBagBuilder API中。我们的目标是获取一个Swing组件,在任意事件中用它做一些事情,并将其订阅到EventBus。问题是我认为EventBus完成的反射操作不喜欢我的任意事件类型的泛型。 本质上,该方法接受双消费者,其中C是Swing组件,E是订阅EventBus的任意事件类型。 事件
问题内容: 就像标题所说,我想使用Guava Collections获得线程安全的HashSet。 有空吗? 问题答案: 这是正确的答案,使用来自Guava的Sets类。无论如何,@ crhis的答案是好的。
让我们跳进 API 获取事件总线 你获取到事件总线的引用,如下所示: EventBus eb = vertx.eventBus(); 还有每个 Vert.x 实例事件总线的单个实例。 注册处理程序 这个最简单的方法来注册一个处理程序用consumer。下面是一个示例: EventBus eb = vertx.eventBus(); eb.consumer("news.uk.sport", mess
番石榴供应商类包含备忘录供应商: 有人能解释一下这句话是什么意思吗? “价值”不需要是易变的;可见性依赖于对“已初始化”的易失性读取。 “初始化”字段上的挥发性如何影响“值”字段?根据这篇文章,我们可以得到“初始化”和“值”字段的不一致组合(例如。真空值)。我说错了吗?