Botões

Pessoal, estou apanhando nesse negocio de Java, tenho um trabalho na faculdade que manda colocar dois botões, um insere e outro retira. O botão insere coloca retangulos coloridos um sobre o outro, no maximo 10… O botão retira tira os retangulos.
Vejam até onde cheguei e por favor me ajudem… Já estou no limite do prazo:

// Arquivo eventos

import java.awt.;
import java.awt.event.
;
import javax.swing.*;
import java.awt.geom.Rectangle2D;
import java.applet.Applet;

public class eventos extends Applet
{

@Override
public void init(){
    add(new Button("Inserir"));
    add(new Button("Retirar"));
    add(new Button("Sair"));
}

// Coloquei esse paint só para testar, coloco um tetangulo
// no Painel,
// @Override
// public void paint(Graphics g)
// {
// Graphics2D g2 = (Graphics2D) g;
// g2.draw(new Rectangle2D.Double(130, 130,130, 50));
// }

@Override
public boolean action(Event evento, Object quem) {
    
    
    if(evento.target instanceof Button) {
      String label = (String)quem;
      if(label == "Inserir")
          
          //    Aqui chama o metodo para colocar o retangulo
         
         repaint();
      else if (label == "Retirar")
         setBackground(Color.red);  // Só para testar, faz ficar Vermelho
      else if(label == "Sair")
    	  System.exit(1);
      else
    	  return false;
      repaint();
      return true; // não chama mais nenhum action seguinte
    }
    else
      return false; // evento não foi de botão. Próximo action é chamado.

}
}


//Arquivo Main

import java.awt.;
import java.awt.event.
;
import java.applet.Applet;
import javax.swing.*;

public class Main
{

public static void main(String[] args)
{    	
	JFrame janela = new JFrame("Eventos em Botões. ");
	janela.setSize(700, 600);
    Applet principal = new eventos();
    principal.init();
    principal.start();
    janela.add(principal);
            
    janela.setVisible(true);
    
}

}

Bom dia, ainda tentando… O problema esta que não consigo chamar o metodo para colocar figura no Frame quando o botão é acionado.

public boolean action(Event evento, Object quem)
{
if(evento.target instanceof Button)
{
String label = (String)quem;
if(label == “Inserir”)
// O que colocar aqui para colocar uma figura no Frame (Ex.: um retangulo)

  • O codigo identado esta aqui:

http://paste.archlinux-br.org/583

Se puderem me ajudar…

Oi.

Você pode colocar código indentado no GUJ usado as tags code. Assim:

//Seu código aqui

Experimente fazer isso num post. Para mais informações sobre esse e outros recursos do fórum, leia esse tópico:
http://www.guj.com.br/posts/list/50115.java

Antes de tudo, sobrescreva JApplet, e não Applet.

  1. Crie um ArrayList<Rectangle2D>, que conterá todos os retângulos já inseridos;
  2. No botão de Inserir, crie um retângulo e coloque-o dentro do ArrayList. Chame repaint();
  3. No método paint do seu JApplet, pinte todos os retângulos que estão dentro do seu ArrayList;
  4. No botão de remover, remova o último retângulo do arrayList e chame novamente o repaint();

Interessante…

public class eventos extends Applet
{    
	public void init(){
        add(new Button("Inserir"));
        add(new Button("Retirar"));
        add(new Button("Sair"));
    }
   
    public boolean action(Event evento, Object quem) {
        if(evento.target instanceof Button) {
          String label = (String)quem;
          if(label == "Inserir")
              
// Como colocar um retangulo aqui?
              
	    	repaint();         

          else if (label == "Retirar")
             setBackground(Color.red);  // Só para testar, faz ficar Vermelho
          else if(label == "Sair")
        	  System.exit(1);
          else
        	  return false;
          repaint();
          return true; // não chama mais nenhum action seguinte
        }
        else
          return false; // evento não foi de botão. Próximo action é chamado.
   }
}

Boa noite ViniGodoy,

Como disse, apesar de já ter programado em Clipper, esse negocio de ambiente gráfico ta me dando um porre. Paciência comigo...
  1. Mudei o ?extends Applet? por ?extends JApplet?, inclusive no Main e os botões simplesmente sumiram, não funcionou. Voltei ao que era.
  2. Criar um ArrayList. Pelo que pesquisei o ArrayList é como um container ou janela que armazenamos as figuras, mas a janela já existe com o JFrame no main…
  3. Essa é minha principal (apesar de ter outras) duvida, como criar um retângulo dentro do botão inserir?

Esse final de semana vou tentar comprar o livro do Deitel para ver se ajuda, mas de qualquer forma muito obrigado.

1 curtida

Eu não costumo a fazer isso, mas como muita gente por aqui tem dúvida com interface gráfica, decidi postar a solução do seu exercício. Recomendo fortemente que você a estude e talvez simplifique para o caso da sua aula. É bom lembrar que esse fórum é público e talvez o seu professor conheça ele tanto quanto você (meus alunos as vezes se esquecem disso):

[code]import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;

/**

  • Este applet é formado por um painel com os botões de adicionar e remover, e

  • um outro componente, que contém o código que efetivamente desenha os

  • retângulos.
    */
    public class Retangulos extends JApplet {

    private JButton btnAdicionar = null;
    private JButton btnRemover = null;
    private AreaRetangulos areaRetangulos = new AreaRetangulos();

    public Retangulos() {
    // Definimos nosso layout como o de borda
    setLayout(new BorderLayout());

     // Criamos um painel com os botões de adicionar e remover
     JPanel painelBotoes = new JPanel(new FlowLayout());
     painelBotoes.add(getBtnAdicionar());
     painelBotoes.add(getBtnRemover());
    
     // Adicionamos o painel dos botões no norte (topo)
     add(painelBotoes, BorderLayout.NORTH);
    
     // Agora, adicionamos o painel dos retângulos
     add(areaRetangulos, BorderLayout.CENTER);
    
     setSize(800, 800);
    

    }

    private JButton getBtnAdicionar() {
    if (btnAdicionar != null)
    return btnAdicionar;

     btnAdicionar = new JButton("Adicionar");
     btnAdicionar.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             // Pedimos para o painel desenhador de retângulos para adicionar
             // um novo retângulo
             areaRetangulos.adicionar();
         }
     });
    
     return btnAdicionar;
    

    }

    private JButton getBtnRemover() {
    if (btnRemover != null)
    return btnRemover;

     btnRemover = new JButton("Remover");
     btnRemover.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             // Pedimos para o painel desenhador de retângulos para remover
             // o último retângulo
             areaRetangulos.remover();
         }
     });
    
     return btnRemover;
    

    }
    }

/**

  • Este é o painel que efetivamente desenha os retângulos em si. Ele contém uma

  • lista dos retângulos que são desenhados. É nessa lista que você mexe.
    */
    class AreaRetangulos extends JComponent {
    private List<Rectangle2D> desenhados = new ArrayList<Rectangle2D>();

    /**

    • Adiciona um único retângulo na lista de retângulos a serem desenhados.

    • Esse retângulo terá tamanho e posição aleatórias.
      */
      public void adicionar() {
      // Calculamos a posição de modo a não ultrapassar o limite do
      // componente.
      int h = getHeight() / 2;
      int w = getWidth() / 2;

      // Criamos um retângulo
      Random r = new Random();
      Rectangle2D rect = new Rectangle2D.Float(r.nextInt(w), r.nextInt(h), r
      .nextInt(w), r.nextInt(h));

      // Adicionamos ele na lista que será desenhada
      desenhados.add(rect);

      // Pedimos para o applet se redesenhar, já que existe um novo
      // retângulo
      repaint();
      }

    /**

    • Remove o último retângulo da lista. Ele foi também o último retângulo a

    • ser desenhado.
      */
      public void remover() {
      // Removemos o último elemento desenhado
      // O método remove aceita um índice que vai de 0 (primeiro elemento) até
      // size()-1 (último elemento).
      desenhados.remove(desenhados.size() - 1);

      // Pedimos para o applet se redesenhar, já que um retângulo foi
      // removido
      repaint();
      }

    /**

    • O método a ser sobrescrito num JComponent é o paintcomponent, não o

    • paint. O paint você só sobrescreve nas classes JFrame, JDialog, JApplet e

    • JInternalPane. Para redesenhar o componente, simplesmente apagamos todo o

    • seu conteúdo e desenhamos todos os retângulos que estão na lista de novo.

    • Esse método é chamado automaticamente, sempre que o repaint() é invocado.
      */
      @Override
      protected void paintComponent(Graphics g) {
      // Não podemos alterar o contexto gráfico g recebido
      // no parâmetro. Por isso, tiraremos uma cópia dele.
      Graphics2D g2d = (Graphics2D) g.create();

      // Limpamos toda a área de applet
      g2d.clearRect(0, 0, getWidth(), getHeight());

      // Desenhamos todos os retângulos
      for (Rectangle2D rect : desenhados)
      g2d.draw(rect);

      // Após desenhar, apagamos a cópia do ambiente gráfico
      g2d.dispose();
      }
      }[/code]

Neste exemplo os retângulos não estão preenchidos e nem são coloridos. Deixo esse “upgrade” para você.

Olá ViniGodoy,

É até bom meu professor conhecer esse fórum, assim vai saber que estou indo atrás de entender o conteúdo. Não vou mandar seu código completo, mas estudar linha a linha e tentar entender o negocio.
Estou fazendo na UFSCAR, curso EAD de Sistema de Informação. Esse semestre a mesma matéria foi mesclada com C++ e Java, mas o que enroscou mesmo foi a Interface Gráfica. 
Me falaram que EAD era fácil, mas o pessoal da UFSCAR esta puxando muito, de 50 alunos hoje somos em torno de 10.

Muito obrigado pela força.