Dibujar un gráfico lineal sencillo en Java
En mi programa quiero dibujar un simple gráfico de línea de puntuación. Tengo un fichero de texto y en cada línea hay una puntuación entera, que leo y quiero pasar como argumento a mi clase graph. Estoy teniendo algunos problemas para implementar la clase graph y todos los ejemplos que he visto tienen sus métodos en la misma clase que su main, cosa que yo no tendré.
Quiero poder pasar mi array al objeto y generar un gráfico, pero al llamar a mi método paint me está pidiendo un Graphics g... Esto es lo que tengo hasta ahora:
public class Graph extends JPanel {
public void paintGraph (Graphics g){
ArrayList<Integer> scores = new ArrayList<Integer>(10);
Random r = new Random();
for (int i : scores){
i = r.nextInt(20);
System.out.println(r);
}
int y1;
int y2;
for (int i = 0; i < scores.size(); i++){
y1 = scores.get(i);
y2 = scores.get(i+1);
g.drawLine(i, y1, i+1, y2);
}
}
}
Por ahora he insertado un simple generador de números aleatorios para rellenar mi array.
Tengo un marco existente y, básicamente, quiero instanciar la clase Graph y montar el panel en mi marco. Siento mucho que esta pregunta parezca tan confusa por cierto, pero he dormido poco...
El código en mi declaración principal es:
testFrame = new JFrame();
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Graph graph = new Graph();
testFrame.add(graph);
No estoy seguro exactamente lo que es un SSCE, pero este es mi intento de uno:
public class Test {
JFrame testFrame;
public Test() {
testFrame = new JFrame();
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Graph graph = new Graph();
testFrame.add(graph);
testFrame.setBounds(100, 100, 764, 470);
testFrame.setVisible(true);
}
Graph.java
public class Graph extends JPanel {
public Graph() {
setSize(500, 500);
}
@Override
public void paintComponent(Graphics g) {
Graphics2D gr = (Graphics2D) g; // This is if you want to use Graphics2D
// Now do the drawing here
ArrayList<Integer> scores = new ArrayList<Integer>(10);
Random r = new Random();
for (int i : scores) {
i = r.nextInt(20);
System.out.println(r);
}
int y1;
int y2;
for (int i = 0; i < scores.size() - 1; i++) {
y1 = (scores.get(i)) * 10;
y2 = (scores.get(i + 1)) * 10;
gr.drawLine(i * 10, y1, (i + 1) * 10, y2);
}
}
}
Problemas con su código y sugerencias:
pack()
en su JFrame después de añadirle componentes y antes de llamar a setVisible(true)paintComponent(...)
sino sólo código de pintura. Así que yo haría la ArrayList una variable de clase y la llenaría dentro del constructor de la clase.Por ejemplo:
Lo que creará un gráfico que se ve así: introduzca aquí la descripción de la imagen
O simplemente utilice la biblioteca JFreechart - http://www.jfree.org/jfreechart/ .
Sobrescribe el método paintComponent de tu panel para poder dibujar de forma personalizada. Así: