0
votes

hello am trying to paint my feature ( collection of geometry with a specific color ) but i get this error: it's a problem with the arraylist to be casted but i don't how to fix it PLZ help me Thanks in advance

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: 

java.util.ArrayList cannot be cast to com.vividsolutions.jts.geom.GeometryCollection at com.vividsolutions.jump.workbench.ui.plugin.specific.SearchPropertiesPlugin$3.actionPerformed(SearchPropertiesPlugin.java:205) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6297) at javax.swing.JComponent.processMouseEvent(JComponent.java:3275) at java.awt.Component.processEvent(Component.java:6062) at java.awt.Container.processEvent(Container.java:2039) at java.awt.Component.dispatchEventImpl(Component.java:4660) at java.awt.Container.dispatchEventImpl(Container.java:2097) at java.awt.Component.dispatchEvent(Component.java:4488) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4575) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4236) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4166) at java.awt.Container.dispatchEventImpl(Container.java:2083) at java.awt.Window.dispatchEventImpl(Window.java:2489) at java.awt.Component.dispatchEvent(Component.java:4488) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:668) at java.awt.EventQueue.access$400(EventQueue.java:81) at java.awt.EventQueue$2.run(EventQueue.java:627) at java.awt.EventQueue$2.run(EventQueue.java:625) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) at java.awt.EventQueue$3.run(EventQueue.java:641) at java.awt.EventQueue$3.run(EventQueue.java:639) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:638) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

here's where he get's the exception:

Viewport viewport = new Viewport(context.getLayerViewPanel());
Paint fillPaint = null;
Color color = Color.yellow;
Stroke stroke =new BasicStroke(5, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);
final Graphics2D graphics = (Graphics2D) context.getLayerViewPanel().getGraphics();

//in this line:

paintGeometryCollection((GeometryCollection) selectedFeatures(),
                                        graphics, viewport, true,
                                        stroke,fillPaint, true,
                                        stroke, color);

and here's the other methods that it needs:

public Collection selectedFeatures() {
    ArrayList selectedFeatures = new ArrayList();
    for(BasicFeature basicFeature : TitreList) {
    selectedFeatures.add(search().getGeometry());
    // search() is a BasicFeature
    }
    return selectedFeatures;
}   


    private static void paintGeometryCollection(GeometryCollection collection,
        Graphics2D g, Viewport viewport, boolean renderingFill,
        Stroke fillStroke, Paint fillPaint, boolean renderingLine,
        Stroke lineStroke, Color lineColor)
        throws NoninvertibleTransformException {
        //For GeometryCollections, render each element separately. Otherwise,
        //for example, if you pass in a GeometryCollection containing a ring and a
        // disk, you cannot render them as such: if you use Graphics.fill, you'll get
        //two disks, and if you use Graphics.draw, you'll get two rings. [Jon Aquino]
        for (int i = 0; i < collection.getNumGeometries(); i++) {
            paint(collection.getGeometryN(i), g, viewport, renderingFill,
                fillStroke, fillPaint, renderingLine, lineStroke, lineColor);
        }
    }


public static void paint(Geometry geometry, Graphics2D g,
        Viewport viewport, boolean renderingFill, Stroke fillStroke,
        Paint fillPaint, boolean renderingLine, Stroke lineStroke,
        Color lineColor) throws NoninvertibleTransformException {
        if (geometry instanceof GeometryCollection) {
            paintGeometryCollection((GeometryCollection) geometry, g, viewport,
                renderingFill, fillStroke, fillPaint, renderingLine,
                lineStroke, lineColor);

            return;
        }

        Shape shape = toShape(geometry, viewport);
        if (!(shape instanceof GeneralPath) && renderingFill) {
            g.setStroke(fillStroke);
            g.setPaint(fillPaint);
            g.fill(shape);
        }
        if (renderingLine) {
            g.setStroke(lineStroke);
            g.setColor(lineColor);
            g.draw(shape);
        }
    }

private static Shape toShape(Geometry geometry, Viewport viewport)
throws NoninvertibleTransformException {
//At high magnifications, Java rendering can be sped up by clipping
//the Geometry to only that portion visible inside the viewport.
//Hence the code below. [Jon Aquino]
Envelope bufferedEnvelope = EnvelopeUtil.bufferByFraction(viewport.getEnvelopeInModelCoordinates(),
        0.05);
Geometry actualGeometry = geometry;
Envelope geomEnv = actualGeometry.getEnvelopeInternal();
if (! bufferedEnvelope.contains(geomEnv)) {
  /**
   * MD - letting Java2D do more clipping actually seems to be slower!
   * So don't use following "optimization"
   */
  //if (isRatioLarge(bufferedEnvelope, geomEnv, 2)) {
    if (!((geometry instanceof LineString) || (geometry instanceof MultiLineString)))
        actualGeometry = clipGeometry(geometry, bufferedEnvelope);
    //System.out.println("cl");
  //}
}
return viewport.getJava2DConverter().toShape(actualGeometry);
   }

private static Geometry clipGeometry(Geometry geom, Envelope env)
{
  try {
      Geometry clipGeom = EnvelopeUtil.toGeometry(env)
                                   .intersection(geom);
      return clipGeom;
  } catch (Exception e) {
      //Can get a TopologyException if the Geometry is invalid. Eat it. [Jon Aquino]
      //Can get an AssertionFailedException (unable to assign hole to a shell)
      //at high magnifications. Eat it. [Jon Aquino]

      //Alvaro Zabala reports that we can get here with an
      //IllegalArgumentException (points must form a closed linestring)
      //for bad geometries. Eat it. [Jon Aquino]
  }
  return geom;
}
1
for better help sooner post an SSCCE, short, runnable, compilable, use JLayer(Java7) for painting instead of JViewport, otherwise have to override setScrollMode(JViewport.Xxx) and to use with own RepaintManager (sure those methods aren't something with code snipped posted here)mKorbel
to use Whatever.getGraphics(); only for printing to the BufferedImage, File, printing to the paper printer, this methods creates internal snapshot that will expire on first eventmKorbel
not answerable this question without posting an SSCCE, short, runnable, compilablemKorbel
@mKorbel oki, but what's the difference between the two? (Jlayer and JViewport). because now am working on Code source of OpenJump, they are using JViewport.Asma.O
jump from last millennium to the current :-)mKorbel

1 Answers

2
votes

The public Collection selectedFeatures() returns Colecction but you cast it to GeometryCollection. For me that's the problem.

The line paintGeometryCollection((GeometryCollection) selectedFeatures(),