Page 1 of 1

Associating object with chart point/finding specific chart p

Posted: Mon Jan 26, 2015 10:37 am
by 17471177
Hello,

I was trying to find a way to associate an object with a point in Chart (Line series), because I need to be able to display specific information in the tool tip on mouse hover or alternatively do some specific action on point double click. I tried using the returned value index from the add method, but it does not make sense, because the initial data is not sorted, so any kept index, can be overwritten when the chart rearranges its internal data. Am I missing some obvious way to do this?

Thanks,
Plamen

Re: Associating object with chart point/finding specific chart p

Posted: Mon Jan 26, 2015 12:19 pm
by yeray
Hi Plamen,

You can to use the MarkTextResolver or seriesClicked events provided to change the behaviour according to your needs:

Code: Select all

        tChart1.getAspect().setView3D(false);
        tChart1.getLegend().setVisible(false);

        Points point1 = new Points(tChart1.getChart());
        point1.fillSampleValues();
        
        point1.addSeriesMouseListener(new SeriesMouseAdapter() {
			
			@Override
			public void seriesClicked(SeriesMouseEvent e) {
				
			}
		});
        
        point1.setMarkTextResolver(new MarkTextResolver() {
			
			@Override
			public String getMarkText(int valueIndex, String markText) {
				
				return markText;
			}
		});

Re: Associating object with chart point/finding specific chart p

Posted: Mon Jan 26, 2015 2:15 pm
by 17471177
Hi Yeray,

thanks for your quick answer, but I am afraid I might have not been clear enough specifying my question.
Suppose I have number of objects, O1 through On.

I want to plot one of their properties vs another, and I also want to be able, when user hovers over a point to retrieve the original object O whose properties this point reflects, and probably to display third property. For example if my object has field members:
double x;
double y;
String name;

I want to be able to retrieve the object whose x and y coordinates this point represents and display name property when the mouse is over this chart point.
I thought that using method add(x,y,text) will do, but it does not work as I expected.

regards,

Re: Associating object with chart point/finding specific chart p

Posted: Mon Jan 26, 2015 3:37 pm
by yeray
Hello,

If I understand you correctly, you have something like this:

Code: Select all

		final ArrayList<MyObject> myObjectsList = new ArrayList<MyObject>();
		for (int i=0; i<10; i++) {
			myObjectsList.add(new MyObject());
			myObjectsList.get(i).label = "Label " + i;
			myObjectsList.get(i).name = "Name " + i;
			myObjectsList.get(i).x = i + 1;
			myObjectsList.get(i).y = i * 2;
		}
		
        tChart1.getAspect().setView3D(false);
        tChart1.getLegend().setVisible(false);

        final Points point1 = new Points(tChart1.getChart());
        for (int i=0; i<myObjectsList.size(); i++) {
        	point1.add(myObjectsList.get(i).x, myObjectsList.get(i).y, myObjectsList.get(i).label);
        }
        
        point1.getMarks().setVisible(true);
        MarksTip marksTip1 = new MarksTip(tChart1.getChart());
        
        tChart1.getAxes().getBottom().getLabels().setStyle(AxisLabelStyle.VALUE);
And you want the MaksTip tool to show the name property, not the label.
In that case, you could use mouseMove event to find the object that is represented under the mouse, if any, and store it in a global variable (ie objectUnderMouse). Then, you can use the object stored in this global property, if any, at the MarksTip tool getText event as follows:

Code: Select all

		tChart1.addMouseMoveListener(new MouseMoveListener() {

			@Override
			public void mouseMove(MouseEvent arg0) {
				int tmpIndex = -1;
				for (int i = 0; i < point1.getCount(); i++) {
					tmpIndex = point1.clicked(arg0.x, arg0.y);
					if (tmpIndex > -1) {
						objectUnderMouse = null;
						for (int j = 0; i < myObjectsList.size(); j++) {
							if (point1.getXValues().getValue(tmpIndex) == myObjectsList
									.get(j).x) {
								objectUnderMouse = myObjectsList.get(j);
								break;
							}
						}
						break;
					}
				}
			}
		});

		marksTip1.setToolTipResolver(new TextResolver() {

			@Override
			public String getText(Object sender, String text) {
				if (objectUnderMouse != null)
					return objectUnderMouse.name;

				return text;
			}
		});

Re: Associating object with chart point/finding specific chart p

Posted: Mon Jan 26, 2015 3:59 pm
by 17471177
Thanks Yeray,

I think this will work! I will give it a shot and get back to you! I will probably use HashMap with key x_coord_value+"_"+y_coord_value and value the object itself - might be faster than rolling two embedded cycles.

thanks again and regards,
Plamen

Re: Associating object with chart point/finding specific chart p

Posted: Tue Jan 27, 2015 8:21 am
by yeray
Hi Plamen,

Yes, a HashMap will probably be faster. We'll be glad to read your solution if you want to share it here.
And don't hesitate to let us know if you still find problems with it.