[RESOLVIDO] Chamar método para desenhar no jPanel

Bom dia!

  Senhores, estou fazendo um aplicativo que ao clicar num botão mostra um desenho no jPanel, porém acontece o erro abaixo descrito:

[i]Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: javax.swing.JPanel cannot be cast to [/i]
Aqui a minha classe principal:


public class plote extends javax.swing.JFrame {

    /** Creates new form plote */
    public plote() {

        
        initComponents();
    }

       @SuppressWarnings("unchecked")
   >

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        
    }                                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
         
        ((desenha)this.jPanel4).desenhaLinha(150, 5);
    
        
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        
    }



        public static void main(String args[]) {
       
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new plote().setVisible(true);

            }
        });
    }


    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    


}

Aqui a classe que chamo quando clico no botão jButton1ActionPerformed

import java.awt.Font;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
/**
 *
 * @author Leandro
 */
public class desenha extends JPanel{


    public desenha() {
       
        this.setFocusable(true); 
        this.setBackground(Color.GRAY); 
    }

    
    
    public void paint(Graphics g){
        super.paint(g);
        //desenhaLinha();
    }



      public void desenhaLinha(int x, int y) {
        Graphics g2 = (Graphics) this.getGraphics();
        //Graphics g = null;
        int xi = x, yi = y, xf = xi + 100, yf = yi + 100;

        g2.setColor(Color.black);
        g2.drawLine(xi, yi, xf, yf); //Desenha uma linha entre o ponto (Xi,Yi) e o ponto (Xf , Yf)

        g2.setColor(Color.black);
        Font serif = new Font("Serif", Font.BOLD, 18);
        g2.setFont(serif);
        //g.drawString("drawLine", xi+10, yi+20);
        
     }
}

[i]Mais uma coisa: não posso usar a classe Graphics G2D.[/i]

Alguém sabe onde está o problema?

Obrigado.

Não funciona pq vc está fazendo errado.

1 - O cast não funciona pq o seu jPanel4 não é do tipo desenha.
2 - Sobreescreva o método paintComponent ao invés do paint. Lembre-se de chamar a versão do paintComponent da superclasse (super.paintComponent).
3 - Chame o método desenhaLinha dentro do método paintComponent, passando como parâmetro o objeto Graphics ao invés de usar o getGraphics.
4 - Para forçar o desenho, vc vai chamar o método repaint() no seu painel. Você NUNCA vai chamar o método paint ou paintComponent diretamente.
5 - O x e o y, vão ser campos da classe de painel. Caso você queira manter os parâmetros x e y do método desenhaLinha, vc teria então que ter dois métodos. Um para setar o x e o y (que são campos da classe) e chamar o repaint e outro que vai fazer o desenho com base no x e y configurados.

Sugestões:
1 - Classes iniciam com letra maiúscula.
2 - Dê nomes melhores aos seus componentes e classes.

Enfim, segue o código do painel corrigido. Fiz duas versões. Não corrigi o código do JFrame.

[code]import java.awt.Font;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

/**

  • Opção 1 - x e y como campos da classe.

  • Precisa chamar setX e setY para atualizar as coordenadas do desenho da linha.
    */
    public class Desenhista extends JPanel{

    private int x;
    private int y;

    public Desenhista() {
    this.setFocusable(true);
    this.setBackground(Color.GRAY);
    }

    @Override
    public void paintComponent(Graphics g){
    super.paintComponent(g);
    desenhaLinha(g);
    }

    // desenhaLinha NUNCA é chamado diretamente
    private void desenhaLinha(g) {

     g.setColor(Color.black);
     g.drawLine(x, y, x+100, y+100);
    
     g.setColor(Color.black);
     Font serif = new Font("Serif", Font.BOLD, 18);
     g.setFont(serif);
     g.drawString("drawLine", x+10, y+20);
    

    }

    public void setX(int x) {
    this.x = x;
    }

    public void setY(int y) {
    this.y = y;
    }

    public int getX() {
    return x;
    }

    public int getY() {
    return y;
    }

}

import java.awt.Font;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

/**

  • Opção 2 - x e y como parâmetros do método.
    */
    public class Desenhista extends JPanel{

    private int xLinha;
    private int yLinha;

    public Desenhista() {
    this.setFocusable(true);
    this.setBackground(Color.GRAY);
    }

    @Override
    public void paintComponent(Graphics g){
    super.paintComponent(g);
    desenhaLinha(g);
    }

    // desenhaLinha NUNCA é chamado diretamente
    private void desenhaLinha(g) {

     g.setColor(Color.black);
     g.drawLine(xLinha, yLinha, xLinha+100, yLinha+100);
    
     g.setColor(Color.black);
     Font serif = new Font("Serif", Font.BOLD, 18);
     g.setFont(serif);
     g.drawString("drawLine", xLinha+10, yLinha+20);
    

    }

    public void desenhaLinha(int x, int y) {
    xLinha = x;
    yLinha = y;
    repaint();
    }

}[/code]
[]´s

Obrigado davidbuzatto pelas dicas,

         Entendi suas explicações, mas como vou definir um objeto jPanel como do tipo Desenhista? Se eu instanciar jPanel como um objeto do tipo Desenhista, como vou fazer para desenhar no painel que quero? Meu JFrame tem 4 painéis.
         Pode me ajudar?

Obrigado pela ajuda, consegui.

Caro leandropaz,
Sua duvida já foi sanada, por favor coloque no titulo do topico o [Resolvido]