Usar o Graphics somente dentro do JPanel

1 resposta
E

Eai Galera!
Seguinte... estou criando uma ferramenta de desenho livre.
Utilizo um JFrame com vários Labels e Jpanel dentro dele.

Em um desses Jpanel é o que vou fazer o desenho livre.

Mas quando tento utilizar o Graphics para desenhar, ele desenha em todo o JFrame, não somente dentro do JPanel que eu quero =/

Pesquisei muito e minha ultima alternativa foi pedir a ajuda de vocês.

Desde já agradeço!

Segue código abaixo (Estou fazendo com NetBeans):

public class Principal extends javax.swing.JFrame {
    int xvalue = -10, yvalue = -10;

    public Principal() {
        super("Drag to paint");        
        initComponents();               
    }
    
    @Override
    public void paint ( Graphics g ){            
        //jPanel1.paint(g);
        g.fillOval(xvalue, yvalue, 10, 10); // desenha o ponto    
   }

    private void jPanel1MouseDragged(java.awt.event.MouseEvent evt) {                                     
        xvalue = evt.getX()+10; // ponto na ponta do mouse
        yvalue = evt.getY()+28;               
        repaint();
    } 
   
    public static void main(String args[]) {               
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Principal().setVisible(true);
            }
        });
    }                   
}

1 Resposta

TerraSkilll
ebeckemkamp Se o código que você fez até agora é esse, fica a pergunta: cade o JPanel no qual você quer desenhar? Você está desenhando no JFrame, pois está sobrescrevendo o método paint() da classe JFrame, quando deveria sobrescrever o paintComponent() de um JPanel. Algo mais ou menos assim:
public class MyPanel extends JPanel{
  @Override
  protected void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g.create();
    Ellipse2D desenho = new Ellipse2D.Double(10, 10, 100, 100); // cria uma elipse
    g2.draw(desenho); // desenha a elipse
    g2.dispose();
  }

  // o código para desenhar ao arrastar deve vir nessa classe também!
}
public class Principal extends javax.swing.JFrame {        
  public Principal() {  
    super("Drag to paint");
    MyPanel p = new MyPanel();
    this.getContentPane().add(p);
    initComponents();                 
  }

  public static void main(String args[]) {                 
    java.awt.EventQueue.invokeLater(new Runnable() {  
    public void run() {  
      new Principal().setVisible(true);  
      }  
    });  
  }                     
}
Obs: não testei este código, podem ser necessários alguns ajustes

Abraço.

Criado 25 de abril de 2013
Ultima resposta 26 de abr. de 2013
Respostas 1
Participantes 2