Duda con clases abstractas

Viendo 9 entradas - de la 1 a la 9 (de un total de 9)
  • Autor
    Entradas
  • #12357

    Cristian
    Participante

    Hola  a todos. He aqui de nuevo…

    Queria consultar como hacer para usar un metodo de una clase abstracta (Graphics), ya que debo mostrar una imagen cuando presiono un boton…pero en la clase que realice no debo heredar la clase Graphics…intente creando otra clase y ahi heredando (poniendo los mas de 50 metodos), luego instancie esa clase para poder usar el metodo draw…pero me da error…luego tambien pense en sobreescribir el metodo paintcomponent, pero no se como pasarlo al actionperformed… (preferiria hacerlo sin usar el metodo paintcomponent) alguien que me ayude en la teoria no que me diga el codigo, esto me serviria para todas las clases abstractas, y si hay algun modo de buscar una clase no abstracta que ya herede de graphics y ahi instanciar (no leyendo una por una).  dejo el codigo y saludos.

    —————————————————————————————

    public class Testeos {

    public static void main(String[] args) {

    prueba objeto1 = new prueba();

    objeto1.setVisible(true);

    objeto1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    }

    class prueba extends JFrame {  //creo el marco

    public prueba() {

    setSize(400, 400);

    setLocationRelativeTo(null);

    setTitle(«Mostrando imagen»);

    prueba2 lamina = new prueba2();

    add(lamina);

    }

    }

     

    class prueba2 extends JPanel implements ActionListener {

    Image imagen1;

    public prueba2() {

    JButton boton1 = new JButton(«Rojo»);

    add(boton1);

    boton1.addActionListener(this);

    }

     

    g.drawImage(imagen1, 0, 0, null);

     

    }

     

    public void actionPerformed(ActionEvent e) {

    try{

    imagen1 = ImageIO.read(new File(«src/graficos/coche.png»));

    }catch(IOException we){

    System.out.println(«noooo»);

    // y aqui como hago para dibujar la imagen

    }

    }

    }

    ————————————

    Saludos

    #12379

    FrankMegia
    Participante

    Hola Cristian, otra vez 🙂

    Esta vez va a ser un poco más complicado guiarte pero lo intentaré. Decirte que he utilizado tu código y casi lo tienes completo pero te faltan un par de cosillas por añadir. Te daré un par de pistas a ver si te sirven.

    Yo no he utilizado el método paintComponent, sino paint. Y segundo decirte que tienes un método heredado de la clase Component, en la clase JPanel, que es repaint(). Este método invoca al método paint que hayas sobreescrito en tu clase. Ahí tendrías una forma de llamar al método paint desde el ActionPerformed.

    Prueba y ya me irás contando.

    Un saludo.

    #12381

    Cristian
    Participante

    Hola frank, y si, nuevamente….)-:

    No, no he podido realizarlo como dices…no se a veces como seguir, ya que no encuentro muy bien la forma de buscar u orientarme con las clases de la api….siempre en general hablando. Actualmente voy por la clase 75, luego retrocedo por no poder tener constancia, retomo y trato de entender cosas que me quedan sin resolver, y una es esta.

    Juan a veces usaba y sobreescribia el metodo paintcomponent, y por lo que entendia es que sobreescribiendo este metodo era como ponerle un lienzo a la mesa y dibujar o escribir sobre el y no en la mesa directamente…

    Ahora siguiendo esa linea, como trabajaria con ese formato, realmente no lo se…trate de usar tu metodo pero tampoco pude. No se como usar el drawimage desde el actionperformed, cree otra clase heredando jpanel y ahi cree el acceso a la imagen, la instancie desde el actionperformed y ahi coloque el drwimage, pero me da error…. son talvez pavadas para vos, pero en mi caso se me complica el uso y acceso a algunas clases y trabajar con sus metodos y obtener lo que quiero.

    Se que hay muchas formas de resolver un mismo problema, por lo que si esta en tus posibilidades me gustaria seguir lo que tu me dices y usando el paitcomponent…

    desde ya mis cordiales saludos

    Cristian

    #12382

    FrankMegia
    Participante

    Hola Cristian:

    Bueno, no te preocupes que nadie nace sabiendo, y practicando y cometiendo errores es como se aprende. Al menos así aprendí yo 🙂

    Te voy a poner con palabras ( no con código) cómo sería la clase que hereda de JPanel (e implementa ActionListener) donde tendrás el botón y donde aparecerá la imagen:

    – Constructor: Declarar e instanciar el botón, añadirle el actionListener al botón y finalmente añadir el botón a la lamina. (Esto ya lo tenías hecho tú).

    – Sobreescribir el método paintComponent: Como habrás visto en el curso, cuando se sobreescribe este método es muy aconsejable llamar al método que sobreescribimos de la clase padre(JPanel), y para eso tenemos el super. Hecho esto, ya puedes dibujar la imagen con los parámetros que tenías.

    – Implementar el método actionPerformed (dónde parece que tienes el problema):  Como bien hiciste tú, almacenas la imagen en la variable de tipo Image que ya tenías creada, dentro de un try/catch. Y acto seguido, llamas al método que solicita que se repinte el componente, en este caso, repaint(). Como el método ya viene heredado por cadena de herencia en el JPanel, no necesitas instanciar nada, solo llamarlo directamente. Igual que haces con el método ‘add’ que tampoco le pones nada delante. En el catch solo tienes que poner el mensaje de error.

    Y ya estaría hecho. Resumiendo: cuando pulsas el botón, entra en el actionPerformed, carga la imagen y pides que se repinte el panel. Como lo tienes sobreescrito(paintComponent), primero dibujará de la forma que lo hace habitualmente el JPanel, de ahí la llamada a super…, y después dibuja la imagen cargada.

    Espero que te quede un poco más claro así. Ya me contarás.

    Un saludo.

    #12390

    Cristian
    Participante

    Frank, gracias por tu pronta rpta. Pero lamentablemente  sigo sin captar como dibujar la imagen… en el codigo he colocado el g.draw…pero no iria, ya que solo debe dibujar la imagen cuando presione el boton.

    ———————————
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>public class Testeos {</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>public static void main(String[] args) {</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>prueba objeto1 = new prueba();</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>objeto1.setVisible(true);</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>objeto1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>}}</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>class prueba extends JFrame {  //creo el marco</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>public prueba() {</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>setSize(400, 400);</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>setLocationRelativeTo(null);</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>setTitle(«Mostrando imagen»);</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>prueba2 lamina = new prueba2();</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>add(lamina);</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>}}</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»></p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>class prueba2 extends JPanel implements ActionListener {</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>Image imagen1;</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>public prueba2() {</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>JButton boton1 = new JButton(«Rojo»);</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>add(boton1);</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>boton1.addActionListener(this);//aqui coloco el boton para que capte el evento</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>} }</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»></p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>public void actionPerformed(ActionEvent e) {</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>try{</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>imagen1 = ImageIO.read(new File(«src/graficos/coche.png»));</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>}catch(IOException we){</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>System.out.println(«no se encuentra el archivo»);</p>
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>// y aqui como hago para dibujar la imagen</p>
    repaint();//pero no me funciona, lei la api pero relaciona otros parametros
    <p style=»box-sizing: border-box; margin: 10px 0px; -webkit-font-smoothing: antialiased; font-size: 14px; font-family: Lato; color: #444444;»>}}}</p>
    ————————————————————

    Algo debo estar entendiendo mal, pero no se que es…vi en google otras opciones de usar el metodo repaint pero no lo vi tan facil…

    Aguardo tus comentarios…

    Saludos!

    #12397

    FrankMegia
    Participante

    Hola Cristian: Como parece que te está costando un poco, y está claro que lo has intentado de muchas maneras, te pongo el código comentado, a ver si así lo ves más claro. Ya se que no querías el código pero tampoco es que yo sea un genio explicando 🙂

    class prueba2 extends JPanel implements ActionListener {

    Image imagen1;
    public prueba2() {
    JButton boton1 = new JButton(«Rojo»); //Declara e instancia el botón
    boton1.addActionListener(this); //Añade el actionListener al botón
    add(boton1); //Añade el botón a la lamina
    }

    //Este método sobreescrito será llamado con la llamada a repaint, y lo hace internamente, tu no tienes que pasar parámetros ni nada
    public void paintComponent(Graphics g) {
    super.paintComponent(g); //Llamada al método de la clase padre, para que dibuje el botón normalmente
    g.drawImage(imagen1, 0, 0, null); //Dibuja la imagen con los parámetros que tu estableciste. Hasta que no se cargue la imagen, imagen1 será null, es decir, no dibujará nada.
    }

    //Método que se ejecutará cuando pulses el botón, es decir, sólo cargará la imagen y repintará con la imagen, cuando lo pulses.
    public void actionPerformed(ActionEvent e) {
    try{
    imagen1 = ImageIO.read(new File(«src/libro_abierto.png»)); //Carga la imagen
    repaint(); //Obliga a repintar la lamina, con lo que internamente llamará a paintComponent
    }catch(IOException we){
    System.out.println(«noooo»); //Mensaje de error
    }
    }
    }

    Espero que viendo el código con los comentarios te ayude.

    Un saludo.

    #12400

    Cristian
    Participante

    Excelente Frank, una vez mas gracias por tu tiempo.

    Lo imaginaba de una forma que nada que ver, y si, si no hubieras puesto el codigo te hubiera cansado….jajaja. Entendi perfecto y me quedo la enseñanza.

    La unica duda es los metodos a usar o alternativas, estimo, te lo da la experiencia acumulada, o hay algun tipo de forma de buscar en la api, o necesariamente habra que terminar el curso y ver donde quede parado…?

    Esta duda la tengo desde un principio, algunos metodos talves los entiendo, otros me es imposible conectarlos , y no me doy idea de como encontrar lo que necesito en la api ya que son miles…, pero bueno voy retomando y lentamente avanzando.

    Agradezco tu cordialidad.

    Saludos!

    Cristian

    #12401

    FrankMegia
    Participante

    Qué métodos o clases tienes que usar te lo da experiencia. Sobretodo, buscar mucho por internet, consultar foros (inglés habitualmente), probar código y hacer muchas modificaciones para ver qué resultados se obtienen.

    La persona que me introdujo en el mundo de la programación me dio un buen consejo y suelo aplicarlo muy  a menudo: «Cuando termines el código que estés haciendo, planteate «¿Y si…. ?» Y si le añado esto, y si en vez de hacerlo así lo hago así, y si cambio esto por esto otro… » . Para mí es la mejor manera de aprender y espero que a ti también te sirva. Mientras tanto, si te puedo seguir echando una mano, lo haré encantado. Resolver dudas de otros también ayuda a afianzar conocimientos y nuevos retos que probar.

    Un saludo.

    #12403

    Cristian
    Participante

    Gracias Frank.

    Saludos!

Viendo 9 entradas - de la 1 a la 9 (de un total de 9)
  • Debes estar registrado para responder a este debate.