Ajuda : Transformando Método

6 respostas
Y

Pessoal, desculpa se eu fala alguma bestera, mais eu queria "converter" isso pra um metodo que possa chamar ou algo assim, pq eu nao to conseguindo chamar ele quando eu quero. Ou eu tenho que colocar algo a mais no código na hora de chamar ele?

@Override
   public void paintComponent(Graphics graphics)
    {
      Graphics2D g = (Graphics2D) graphics.create(); 

      g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
      g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);

      g.setColor(Color.BLACK);
      g.fillRect(0, 0, getWidth(), getHeight());

      Dimension size = getSize();
      double w = size.getWidth();
      double h = size.getHeight();
      
      g.setStroke(new BasicStroke(3));
      g.setColor(Color.WHITE);

      for (double deg = 0; deg < 360; deg += 5) {
         AffineTransform at =
         AffineTransform.getTranslateInstance(w / 2, h / 2);
         at.rotate(Math.toRadians(deg));
         g.draw(at.createTransformedShape(l()));
         g.draw(at.createTransformedShape(r()));
         g.draw(at.createTransformedShape(e()));
       }
      g.dispose();
   }

O que eu queria realmente é transformar esse codigo em varios metodos. Por exemplo, Se opçao "girar figuras = selecionada", ele executa esse codigo ai em cima, com o for pra girar as 3 figuras. Agora eu queria que tivesse outro metodo que desenhasse as figuras de outro jeito tambem, nao só girando.

Eu espero que vcs tenham entendido minha duvida, é meio dificil explicar.
Alguem me ajuda por favor :)

6 Respostas

davidbuzatto

Qual a dificuldade?
Basta criar os métodos tendo como parâmetro um Graphics2D, ai vc chama eles a partir da linha 9 do seu exemplo.

[]'s

Y

Eu axo que eu percebi algo, que é por isso que eu to tendo problema.

public class Wallpaper extends JFrame {
    JButton botao1, botao2, desenhar;
    JRadioButton retangulo, elipse, linha, girar;

botao1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            if (retangulo.isSelected() == true && elipse.isSelected() == true && linha.isSelected() == true){
                ImagemJFrame jframedesenho = new ImagemJFrame();
                jframedesenho.setVisible(true);

Aqui, o metodo paintComponent() nao ta sendo chamado, pelo que eu percebi. O JPanel ta executando ele direto, sem chamar com alguma condiçao... Axo que é esse o problema?

As imagens taum aparecendo direto, mesmo com um medoto "Paintcomponent2()" eu nao posso chamar ele, porque nao tem um lugar onde o outro esta sendo chamado. Como resolvo isso? D;

discorpio

Boa noite a todos.

Eu acho (e não axo) , :shock: que quando voce sobrescreveu o método PaintComponent do JPanel, automaticamente voce substituiu o método da super classe pelo atual que voce implementou no JPanel, e se não me falhe a memória, (me corrijam se eu estiver errado) o método PaintComponent da super classe é necessário pela construção de todo o frame do JPanel, mesmo que ele esteja sobrescrito em uma classe extendida (herdada). Assim sendo invoque o método PaintComponent da super classe dentro do método sobrescrito, assim:

@Override  
  public void paintComponent(Graphics graphics)  
   {
     super.paintComponent(graphics)  // Aqui voce invoca a execução do método paintComponent da super classe.     
  
     Graphics2D g = (Graphics2D) graphics.create();   
  
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);  
     g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);  
  
     g.setColor(Color.BLACK);  
     g.fillRect(0, 0, getWidth(), getHeight());  
  
     Dimension size = getSize();  
     double w = size.getWidth();  
     double h = size.getHeight();  
       
     g.setStroke(new BasicStroke(3));  
     g.setColor(Color.WHITE);  
  
     for (double deg = 0; deg < 360; deg += 5) {  
        AffineTransform at =  
        AffineTransform.getTranslateInstance(w / 2, h / 2);  
        at.rotate(Math.toRadians(deg));  
        g.draw(at.createTransformedShape(l()));  
        g.draw(at.createTransformedShape(r()));  
        g.draw(at.createTransformedShape(e()));  
      }  
     g.dispose();  
  }
Y

O problema é que eu nao posso usar o metodo paintComponent() como outro qualquer, quero dizer, nao posso chama-lo onde quero e quando quero. Pra poder desenhar as figuras de outra forma, eu tive que criar outra classe JPanel e outra classe JFrame. Se eu for fazer isso, meu programa vai ficar com umas 100 classes. Por isso eu queria dar um jeito de criar varios metodos em uma classe só, ai conforme as condiçoes fossem verdadeiras eu chamava alguns e outros nao.
Alguem sabe se tem como resolver isso, ou eu vou ter que criar milhoes de classes mesmo?

adriano_si

Então crie Vários métodos que não precisam ter a mesma assinatura ou mesmo nome de paintComponent, fazendo o que você realmente quer…

Aí você reescreve o seu paintComponent chamando cada um de seus métodos novos de acordo com sua condição…

Abs []

discorpio

Yakkut:
O problema é que eu nao posso usar o metodo paintComponent() como outro qualquer, quero dizer, nao posso chama-lo onde quero e quando quero. Pra poder desenhar as figuras de outra forma, eu tive que criar outra classe JPanel e outra classe JFrame. Se eu for fazer isso, meu programa vai ficar com umas 100 classes. Por isso eu queria dar um jeito de criar varios metodos em uma classe só, ai conforme as condiçoes fossem verdadeiras eu chamava alguns e outros nao.
Alguem sabe se tem como resolver isso, ou eu vou ter que criar milhoes de classes mesmo?

Qual é a diferença entre fazer 100 Classes com poucos métodos e fazer uma Classe só com 100 métodos :?:

Ao compararmos esta sua ótica de se criar uma classe só com “n” métodos, a linguagem Java seria comparado a uma linguagem onde tudo é engessado um padrão que não permite a criatividade do desenvolvedor.

Essa dúvida cruel eu também já tive, e isso que voce quer fazer chama-se “Polimorfismo”, e o Polimorfismo não se deve engessar nunca.

Um objeto tem o seu estado que são seus atributos e o seu comportamento que são seus métodos, e o Polimorfismo diz que vários objetos podem ter comportamentos (métodos) diferentes mesmo que sejam oriundos de uma mesma classe, e para fazer o que pretende voce pode fazer atraves da abstração, ou através da Interface.

Crie uma classe Abstrata e programe nela os métodos comuns a todas as classes e os métodos que não são comuns voce declara na classe abstrata como método abstrato, assim quando voce herdar dela, será obrigado a programar todos os seus métodos abstratos

Por outro lado criando uma Interface voce terá que declarar nela todos os métodos como abstratos, e implementá-la em várias classes.

Ao meu ver, se voce quer criar alguns métodos específicos para uma determinada classe somente, voce pode criar uma classe abstrata é programá-la somente com os métodos comuns a todas as classes, e os métodos não comuns voce pode declará-los em várias Interfaces, assim voce pode herdar (extender) os métodos comuns da classe abstrata e ao mesmo tempo implementar os métodos não comuns das Interfaces.

Contudo, vale ressaltar que voce deve fazer uma análise mais apurada da lógica de sua aplicação, e verificar se realmente há necessidade de se programar tantos métodos em uma classe, ou de se criar várias classes com tantos métodos.

Criado 13 de março de 2011
Ultima resposta 14 de mar. de 2011
Respostas 6
Participantes 4