Como tornar uma figura em um gráfico (JMathPlot) clicável?

0 respostas
swperman

Estou usando a biblioteca JMathPlot para fazer um gráfico. Tive algum trabalho para inserir um ícone perto do eixo x do gráfico, representando (teoricamente) algum comportamento específico do gráfico na posição do ícone. O código abaixo gera pontos aleatórios e faz um gráfico de linha ("LinePlot"), e insere o ícone em uma posição aleatória abaixo do eixo x. A minha pergunta é: como tornar essa figura clicável (e o clique nela abrir uma janela)??? A classe PlotableImage não tem nenhum método addMouseListener. Pensei também em inserir a imagem usando talvez um JLabel em cima do gráfico, mas como faria para posicioná-la no gráfico, usando as coordenadas do gráfico? Help!!!!! =)

E aproveitando o ensejo, também gostaria muito de saber se existe uma forma de abaixar um pouco os valores da escala do eixo x, de forma a deixar um espaço maior entre esses numerinhos e o eixo em si, pra poder aumentar a imagem.

p.s. o código todo para a figura é porque na biblioteca parece que não existe um jeito muito fácil de fazer isso. Sempre que a escala dos eixos do gráfico muda, a figura se modifica também, então o que tentei criar foi um artifício pra imagem ficar mais ou menos de tamanho constante, através de alguns cálculos malucos...

import java.io.File;
import java.util.Random;
import javax.swing.JFrame;
import org.math.plot.Plot2DPanel;
import org.math.plot.plotObjects.PlotableImage;
 
public class Test {
	
	//constants
	public static final int 
	MAX_X = 10000, 
	MAX_Y = 40, 
	MAX_POINTS = 100, 
	MIN_POINTS = 10;
	
	public static void main(String[] args) {

		Random r = new Random();
		int n_points = r.nextInt(MAX_POINTS) + MIN_POINTS; // at least 10 points
		double[] x = new double[n_points];
		double[] y = new double[n_points];
		double max_x; // max value of x
		double x_interval = (max_x = (double)r.nextInt(MAX_X)) / (double) n_points; // x-interval between points 
		double max_y = r.nextFloat()*MAX_Y; // max value of y
		for (int i = 0; i < n_points; i++) {
			x[i] = i * x_interval;
			y[i] = r.nextFloat() * max_y;
		}

		Plot2DPanel plot = new Plot2DPanel();
		plot.addLinePlot("Random plot", x, y);
		
		// the image's x and y coordinates 
		// follows graph's coordinate system
		// (not the frame's)
		//
		// nw
		// .
		// .
		// sw....se

		double x_icon = r.nextDouble() * max_x;
		double deviation = .015 * max_x;
		double y_icon = -.007 * max_y;
		double icon_height = -.04 * max_y;
		
		File fimg = new File("img/t.gif"); //quadrado preto 64x64
		double[] sw = {x_icon - deviation, icon_height};
		double[] se = {x_icon + deviation, icon_height};
		double[] nw = {x_icon - deviation, y_icon};
		PlotableImage img = new PlotableImage(fimg, 1, sw, se, nw);
		plot.addPlotable(img);

		JFrame frame = new JFrame("a plot panel");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(800, 800);
		frame.setContentPane(plot);
		frame.setVisible(true);
 
	}
}
Criado 6 de agosto de 2007
Respostas 0
Participantes 1