Autor Tema: Ayuda para eliminar linea dibujada. JAVA graficador para ecuaciones  (Leído 9111 veces)

Choripan

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 20
    • Ver Perfil
Hola, he creado un graficador para ecuaciones de segundo grado, funciona bien! me grafica las ecuaciones, pero cuando ingreso los datos nuevamente, y doy click en "graficar" el programa no me elimina la grafica dibujada previamente, lo que hace es dibujar la nueva grafica encima de esta. Como hago para que al presionar el boton "graficar" me elimine la grafica previamente dibujada, y me dibuje la nueva. Aca dejo el codigo y un par de imagenes.

Codigo
Código: [Seleccionar]
package graficadora;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import java.awt.event.ActionListener;
import graficadora.Graficadora;
/**
 *
 * @author Marcos
 */
public class Graficadora {

    public static plano plano;
   
    public void Grafico() {
       
        Ventana frame = new Ventana();
        frame.setBounds(300, 300, 510, 600);
        frame.setLayout(new BorderLayout());
        plano = new plano();
       
        JButton start = new JButton("Graficar");
        start.addActionListener(frame);
        start.addActionListener(frame);
        colo = new javax.swing.JTextField();
        colo2 = new javax.swing.JTextField();
        colo3 = new javax.swing.JTextField();
        colo.setBounds(10,10,30,30);
        colo2.setBounds(60,10,30,30);
        colo3.setBounds(110,10,30,30);
        aLabel = new javax.swing.JLabel("A");
        bLabel = new javax.swing.JLabel("B");
        cLabel = new javax.swing.JLabel("C");
        aLabel.setBounds(43,13,20,20);
        bLabel.setBounds(93,13,20,20);
        cLabel.setBounds(143,13,20,20);
        aLabel.setFont(new java.awt.Font("Arial", 1, 13));
        bLabel.setFont(new java.awt.Font("Arial", 1, 13));
        cLabel.setFont(new java.awt.Font("Arial", 1, 13));
       
        frame.add(colo);
        frame.add(colo2);
        frame.add(colo3);
        frame.add(aLabel);
        frame.add(bLabel);
        frame.add(cLabel);
       
        frame.add( plano, BorderLayout.CENTER);
        frame.add(start, BorderLayout.SOUTH);
        frame.setVisible( true );

    }
   
public class Ventana extends JFrame implements ActionListener{
    @Override
public void actionPerformed(ActionEvent e) {
String a4;
    a4 = colo.getText();
String b4;
    b4 = colo2.getText();
String c4;
    c4 = colo3.getText();
   
double a5,b5,c5;
a5 = Double.parseDouble(a4);
b5 = Double.parseDouble(a4);
c5 = Double.parseDouble(c4);

Graficadora.plano.paintSQRFunc(Graficadora.plano.getGraphics(),a5,b5,c5,-200,200);
}
   
}
public javax.swing.JTextField colo;
public javax.swing.JTextField colo2;
public javax.swing.JTextField colo3;
public javax.swing.JLabel aLabel;
public javax.swing.JLabel bLabel;
public javax.swing.JLabel cLabel;

}

Código: [Seleccionar]
package graficadora;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
/**
 *
 * @author Marcos
 */
public class plano extends JPanel {
   
    public plano() {
    init();
    }

public void init() {
this.setBorder(BorderFactory.createLineBorder(Color.black));
}
@Override
public void paintComponent( Graphics g ) {
            super.paintComponent(g);
            g.setColor(Color.red);
            g.drawLine(0, this.getHeight()/2, this.getWidth(), this.getHeight()/2);
            g.drawLine(this.getWidth()/2, 0,this.getWidth()/2 , this.getHeight());
    }
   
public void paintSQRFunc( Graphics g, double x2mult,
        double x1mult,double cons, double x1,double x2)
{
    for(double i=x1;i<x2;i++)
    {
        double y = ((double)Math.pow(i,2)*x2mult)+i*x1mult+cons;
        double xp = i+1;
        double yp = ((double)Math.pow(xp,2)*x2mult)+xp*x1mult+cons;
        g.drawLine((int)coord_x(i), (int)coord_y(y), (int)coord_x(xp), (int)coord_y(yp));
        }
}
private double coord_x(double x)
    {
    double real_x = x+this.getWidth()/2;
    return real_x;
    }
private double coord_y(double y)
    {
        double real_y = -y+this.getHeight()/2;
        return (real_y);

        }
}

Este codigo pertenece a un programa que he hecho, poco a poco lo mejoro! pero si me pueden ayudar, seria genial. Ya no se que hacer :( y soy nuevo en esto. Gracias!, ahora un par de imagenes



Ahora, luego de cambiar los valores y graficar nuevamente:



Gracias si me pueden ayudar y explicar.

Nota: Me di cuenta que si minimizo la ventana donde se dibuja mi grafica y la vuelvo a abrir, esta borra la linea dibujada previamente. Por que sucede esto?
« Última modificación: 14 de Septiembre 2014, 18:03 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2053
    • Ver Perfil
Re:Ayuda para eliminar linea dibujada. JAVA
« Respuesta #1 en: 12 de Mayo 2014, 21:16 »
A ver si no me pierdo aunque después de darle unas cuantas vueltas me he perdido

plano es un JPanel sobre el cual se dibuja.

Graficadora contiene como atributo un objeto tipo "plano" que está declarado como tipo estático

¿Por qué lo declaras de tipo estático?


En el método Grafico() de Graficadora se crea un JFrame pero le añades dos actionListener, línea repetida

        start.addActionListener(frame);
        //start.addActionListener(frame);


Supongo que esta repetición es un error ¿no?



El objeto plano que es un JPanel atributo de Graficadora es añadido al Jframe (tipo Ventana que extiende a JFrame) con que se trabaja en el método Grafico()

Luego haces la invocación para dibujar la línea cuando se pulsa el botón

Graficadora.plano.paintSQRFunc(Graficadora.plano.getGraphics(),a5,b5,c5,-200,200);

¿Por qué usas este tipo de invocación? (Supongo que la respuesta es la misma a por qué declaras el objeto plano como atributo estático... pero no logro entender el por qué)


Choripan

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 20
    • Ver Perfil
Re:Ayuda para eliminar linea dibujada. JAVA
« Respuesta #2 en: 13 de Mayo 2014, 02:01 »
Use ese tipo de invocacion, ya que leyendo en internet observer este tipo de sistema, ahora, si usted conoce algo mas factible y simple me lo podria mencionar?

No estudio programacion, pero me gusta aprender poco a poco las cosas, este proyecto que voy haciendo me ha costado como no tienes idea! hahaha, algunas cosas las entiendo bien, otras no tanto, pero poco a poco voy aprendiendo mas. Soy estudiante de Biologia! hahaha, si puedes explicarme como harias tu para lograr lo mismo que yo logre en mi codigo, seria genial!. Ahora, lo que trate de decir es que, cuando mi programa grafica una ecuacion, perfecto, la dibuja, pero si en ese momento quiero graficar una nueva y cambio los valores de A, B y C para graficar una nueva ecuacion, el no me elimina la linea previamente dibujada, si no pinta por encima de esta la nueva linea. Quiero que el programa borre la linea previamente dibujada y dibuje una nueva. (al momento de darle click al boton "graficar", por ejemplo).

Lo otro que encontre es que al graficar una ecuacion, si minimizo la ventana donde estoy graficando, y la vuelvo a abrir, la linea que se dibujo, ya no esta! hahaha, si puedes ayudarme y posiblemente ense#arme, seria genial, gracias de antemano Alex.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2053
    • Ver Perfil
Re:Ayuda para eliminar linea dibujada. JAVA
« Respuesta #3 en: 13 de Mayo 2014, 23:00 »
Ya veo... pensé que eras un semi-experto y por eso me extrañaban algunas cosas. La solución al problema ahora mismo no la sé, lo he mirado por encima y he tratado de usar el método repaint() pero no funciona, al menos no funciona así a la primera. Intentaré volver a mirarlo cuando tenga tiempo. Aunque dices que no estudias programación, no sé si ya has visto el curso de java: https://www.aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

A lo mejor te resulta útil para lo que son fundamentos, aunque para este problema en concreto no. Saludos

Choripan

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 20
    • Ver Perfil
Re:Ayuda para eliminar linea dibujada. JAVA
« Respuesta #4 en: 14 de Mayo 2014, 00:47 »
Gracias Alex por tu respuesta. Yo también trate de usar el método repaint(), pero el resultado no es el que busco, lo que me genera es una nueva ventana idéntica a la anterior, pero sin mostrar los cuadros de texto y eliminando la ventana previa. Si deseas, puedo enviarte todo el proyecto (tanto el ejecutable, como el código) y me dices que te parece.

Gracias realmente por la ayuda, seguiré investigando para ver si logro resolver este problema, si encuentro solución te lo haré saber, de igual manera, si tu encuentras una, me gustaria que me la mencionadas, así aprendo un poco mas!
Saludos!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".