Desenhar uma forma no java com paintComponent(Graphics g)

Bom dia galera, estou estudando o livro use a cabeça java e cheguei na parte de interface grafica porem logo no segundo exemplo os programa não funciona. Sera que alguem poderia me dizer o que esta errado. Desde ja agradeço:

import javax.swing.;
import java.awt.BorderLayout;
import java.awt.event.
;

public class SimpleGui1B implements ActionListener{
JButton button;
/**

  • @param args
    */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    SimpleGui1B gui = new SimpleGui1B();
    gui.go();
    }

public void go(){
JFrame frame = new JFrame();
button = new JButton(“click me”);

button.addActionListener(this);

MyDrawPanel panel = new MyDrawPanel();
frame.getContentPane().add(BorderLayout.NORTH, panel);

frame.getContentPane().add(BorderLayout.SOUTH, button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);

frame.setVisible(true);
}

public void actionPerformed(ActionEvent event){
button.setText(“I’ve bee clicke”);
}

}

import javax.swing.;
import java.awt.
;
public class MyDrawPanel extends JPanel{

public void paintComponent(Graphics g){
///super.paintComponent(g);

setBackground(Color.black);
g.setColor(Color.blue);
g.fillRect(10, 10, 100, 100);

g.fillOval(70, 70, 100, 100);*/
}
}

Por favor, use a tag code:
http://www.guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor

E também diga o que não funciona. O programa nem compila? Ou não faz o que você esperava?
Outra coisa. Por que você comentou a linha do super?

Uma coisa. Troque a posição do painel de NORTH para CENTER. Como seu painel não tem preferredSize definido, ele pode estar ficando muito pequeno.

Cara valeu da proxima vez vou colocar o cod. neste link.Cara ele compila mas não funciona não aparece o desenho, eu comente o super por que na verdade no livro nem fale dele eu vi no forum mais como tb não funcionou eu comentei ele.
Se puder de ajudar cara agradeço!!

Coloca uma borda no seu JPanel, rode e veja se ele tem espaço suficiente para desenhar.

Obrigadão galera agora funciou!!!

Certo! Isso desenha um círculo azul no fundo preto…
Mas a finalidade desse código é fazer com que o círculo mude de cor quando o usuário clica no botão.

Seguem os códigos:

package capitulo12;

import java.awt.*;
import javax.swing.*;

public class MyDrawPanel extends JPanel{

	public void paintComponentes(Graphics g){
	
		Graphics2D g2d = (Graphics2D) g;
		
		
		int red = (int) (Math.random()*255);
		int green = (int) (Math.random()*255);
		int blue = (int) (Math.random()*255);
		
		Color startColor = new Color(red, green, blue);
		
		red = (int) (Math.random()*255);
		green = (int) (Math.random()*255);
		blue = (int) (Math.random()*255);
		
		Color endColor = new Color(red, green, blue);
		
		GradientPaint gradient = new GradientPaint(70, 70, startColor, 150, 150, endColor);
		g2d.setPaint(gradient);
		g2d.fillOval(70, 70, 100, 100);
		
		}
}

[code]package capitulo12;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class SimpleGui3C implements ActionListener{

JFrame frame;

public static void main(String[] args) {
	SimpleGui3C gui = new SimpleGui3C();
	gui.go();
}

public void go(){
	frame = new JFrame();
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
	JButton button = new JButton("Change Colors");
	button.addActionListener(this);
	
	MyDrawPanel drawPanel = new MyDrawPanel();
	
	frame.getContentPane().add(BorderLayout.SOUTH, button);
	frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
	
	frame.setSize(300,300);
	frame.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent arg0) {
	// TODO Auto-generated method stub
	frame.repaint();
}

}
[/code]

O que acontece é que o código está sem erros e compila. Só que só aparece o frame com o botão, nada do círculo. O que tem de errado?

Ahhhh! Erro de digitação!
Obrigada!

Engraçado que estou usando o Eclipse e esse erro não foi indicado…

Ele nao vai saber que voce errou, para ele é apenas um método novo.

Se voce colocasse @Override nele, ai sim ele avisaria que nao existe um método com esse nome na super class.

É verdade! Testei aqui e deu certo!
Vou usar @Override sempre agora.

Obrigada! =)

Pessoal, também sou iniciante na área de Java e a minha dúvida é: Eu usei este método paintComponent, porém para iniciar o java é necessário “public static void main(String[] args)”. Como procedo diante disso? Coloco mesmo a linha citada ou escreve só o método?

Obrigado desde já.

Pessoal, consegui resolver o problema vendo alguma dicas na internet, obrigado!

[code]import java.awt.;
import javax.swing.
;

public class MyDrawPanel extends JPanel{

public static void main(String[] args){		
	MyDrawPanel drawPanel = new MyDrawPanel();
	JFrame frame = new JFrame();
	
	frame.getContentPane().add(drawPanel);
	frame.setSize(300,300);
	frame.setVisible(true);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void paintComponent(Graphics g){
	g.setColor(Color.orange);
	g.fillRect(20, 50, 100, 100);		
}

}[/code]

[quote=Enadrov]Bom dia galera, estou estudando o livro use a cabeça java e cheguei na parte de interface grafica porem logo no segundo exemplo os programa não funciona. Sera que alguem poderia me dizer o que esta errado. Desde ja agradeço:
[/quote]

Você pode editar tua mensagem e colocar o código dentro da tag code :wink:

[code]import javax.swing.;
import java.awt.
;

public class MyDrawPanel extends JPanel {

public void paintComponent(Graphics g) {

    super.paintComponent(g); //Para o fundo ficar black, tem que colocar isto aqui senão não vai
    setBackground(Color.black);
    
    g.setColor(Color.blue);
    g.fillRect(10, 10, 100, 100);

    g.fillOval(70, 70, 100, 100);
    
}

}[/code]
O ViniGodoy já indicou tua correção para o retangulo e oval.

[quote=KamillaaaH]Certo! Isso desenha um círculo azul no fundo preto…
Mas a finalidade desse código é fazer com que o círculo mude de cor quando o usuário clica no botão.

O que acontece é que o código está sem erros e compila. Só que só aparece o frame com o botão, nada do círculo. O que tem de errado?

[/quote]
Começa que o nome do método está errado: paintComponentes

A API fornece dois métodos: paintComponents e paintComponent.
Eu testei com o paintComponent e funcionou.