【问题标题】:How to establish a click listener in a separate class from the event Vaadin如何在与事件 Vaadin 不同的类中建立点击侦听器
【发布时间】:2015-10-01 17:43:39
【问题描述】:

我对 Vaadin 和 v-Leaflet 非常陌生。我创建了一个组件,它获取一些 geojson 数据并将其放在地图上。我可以单击任何多边形/多多边形并以通知的形式取回一些信息。问题是,我需要获取这些信息并单击事件,并让它影响它们自己独立类中的其他 4 个独立组件。在过去的两天里,我一直在为此绞尽脑汁,但似乎无法理解。

这是我的地图/点击事件:

private LMap map;
        String filePath = this.getClass().getResource("/fccpeasgeo.json").getPath();
        File file = new File(filePath);
        //ArrayList<String> peaNames = new ArrayList<String>();



        //@Override
        public LMap createMap() {

            map = new LMap();

             FeatureJSON io = new FeatureJSON();
                try {
                    long currentTimeMillis = System.currentTimeMillis();
                    // Look ma, no proxy needed, how cool is that!
                    FeatureCollection fc = io.readFeatureCollection(file);
                    Logger.getLogger(LeafletMap.class.getName()).severe("Download in " + (System.currentTimeMillis() - currentTimeMillis));
                    currentTimeMillis = System.currentTimeMillis();

                    FeatureIterator iterator = fc.features();
                    try {
                        while (iterator.hasNext()) {
                            Feature feature = iterator.next();
                            final String name = feature.getProperty("PEA_Name").getValue().toString();
                            final String population = feature.getProperty("POPs_2010").getValue().toString();
                            Geometry geometry = (Geometry) feature.getDefaultGeometryProperty().getValue();

                            // The geojson provided in example is rather complex (several megabytes)
                            // Use JTS to simplyfy. Note that it is rather easy to use 
                            // different settings on different zoom levels, as well as decide
                            // to drop the feature form client altogether
                            geometry = DouglasPeuckerSimplifier.simplify(geometry, 0.2);

                            // In this example can be Polygon/Multipolygon
                            Collection<LeafletLayer> toLayers = JTSUtil.toLayers(geometry);
                            for (LeafletLayer l : toLayers) {
                                map.addComponent(l);
                                if (l instanceof LPolygon) {
                                    LPolygon lPolygon = (LPolygon) l;
                                    lPolygon.addClickListener(new LeafletClickListener() {

                                        @Override
                                        public void onClick(LeafletClickEvent event) {
                                            Notification.show("PEA: " + name + " Population: " + population);
                                        }
                                    });
                                }
                            }
                        }
                        Logger.getLogger(LeafletMap.class.getName()).severe("Reducing and creating layers " + (System.currentTimeMillis() - currentTimeMillis));

                    } finally {
                        iterator.close();
                    }

                } catch (MalformedURLException ex) {
                    Logger.getLogger(LeafletMap.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(LeafletMap.class.getName()).log(Level.SEVERE, null, ex);
                }

            map.zoomToContent();
            //map.setCenter(40, -95.2);
            //map.setZoomLevel(2.5);
            LTileLayer tf = new LTileLayer();
            tf.setUrl("http://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png");
            tf.setSubDomains(new String[]{"a", "b", "c"});
            tf.setActive(true);
            map.addBaseLayer(tf, "ThunderForest Transport");

            return map;

        }

这是将接收事件的组件之一。

public Chart mhzPerSqMile() {
        Chart chart = new Chart();


        run();

        chart.setCaption("Total MHz Per Square Mile");
        chart.getConfiguration().setTitle("");
        chart.getConfiguration().getChart().setType(ChartType.PIE);
        chart.getConfiguration().getChart().setAnimation(false);
        chart.setWidth("100%");
        chart.setHeight("90%");

        DataSeries series = new DataSeries();

        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            if (evt.getPropertyName()!=null)
            {
                if (evt.getPropertyName().equals("abcTask"))
                {

                }
             }


        for (int i = 0; i < 5; i++) {
            Operator operator = operators.get(i);
            if (selectedPea != null) {
                if (operator.getPeaName().toLowerCase() == selectedPea.toLowerCase()){
                    DataSeriesItem item = new DataSeriesItem(operator.getName(),
                    operator.getTotalMHzSqMile());
            series.add(item);
            item.setColor(DummyDataGenerator.chartColors[i]);
        }
            }
            }
        chart.getConfiguration().setSeries(series);
        PlotOptionsPie opts = new PlotOptionsPie();
        opts.setBorderWidth(0);
        opts.setShadow(false);
        opts.setAnimation(false);
        chart.getConfiguration().setPlotOptions(opts);

        Credits c = new Credits("");
        chart.getConfiguration().setCredits(c);


        return chart;
    }
    }
}

任何建议将不胜感激!

【问题讨论】:

    标签: javascript java leaflet vaadin vaadin7


    【解决方案1】:

    我认为您只需要触发具有任何特定名称(事件名称)的属性,并且您的所有侦听器类都已实现 PropertyChangeListener 触发每个 fireProperty() 调用,显然您在那里匹配您的事件名称,因此收到这样的属性更改后,你们 4 个班级都会执行他们的任务

    您需要为当前实例注册PropertyChangeSupport

    PropertyChangeSupport pcs = new PropertyChangeSupport(this);
    

    您将进一步使用此对象来触发您的事件

    触发事件

    //this firing code will probably go inside your click method that actually causes an event to occur
        pcs.firePropertyChange("abcTask", oldValue, newValue);
    

    接收事件

    @Override
        public void propertyChange(PropertyChangeEvent evt) 
        {
            if (evt.getPropertyName()!=null)
            {
                if (evt.getPropertyName().equals("abcTask"))
                {
                    //perform task
                }
             }
         }
    

    【讨论】:

    • 非常感谢,这似乎很有意义!你认为我们可以聊一聊关于在程序中实现这一点的更多细节吗?我是 Vaadin 的新手,只是对几个步骤感到困惑。 @SSH
    • 如果它对你有帮助我很高兴,如果它适合你,也接受这个答案......你也可以问你是否有任何进一步的疑问,我会尽力回答你
    • 我想我的第一个困惑点是如果我需要因事件而更改的东西是字符串,那么 oldValue 和 newValue 应该是什么。例如,当事件触发时,我需要组件从地图的点击部分中获取新的“名称”并在其逻辑中使用它。我将组件类之一添加到上下文代码中。 @SSH
    • oldValue 和 newValue 是它所期望的两个对象类型参数,因此您可以通过该事件调用传递任何对象,也可以根据需要将 null 传递给它们中的任何一个或两者
    • 就像我有一个文本字段,并且在更改其值时,我需要使用先前在文本字段中的旧值以及现在存在的新值触发事件,所以我可以传递它们,或者如果我以前什么都没有,我可以通过 null...我所有的逻辑都在进一步
    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多