Botões

7 respostas
A

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.<em>;

import java.awt.event.</em>;

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  para testar, coloco um tetangulo

//              no Painel,

//    <a class="mention" href="/u/override">@Override</a>

//    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);  //  para testar, faz ficar Vermelho
      else if(label == "Sair")
    	  System.exit(1);
      else
    	  return false;
      repaint();
      return true; // £o chama mais nenhum action seguinte
    }
    else
      return false; // evento £o foi de botão. Próximo action é chamado.

}
}


//Arquivo Main

import java.awt.<em>;

import java.awt.event.</em>;

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);
    
}

}

7 Respostas

A

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…

V

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

V

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();
A

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.
   }
}
A

Boa noite ViniGodoy,

Como disse, apesar de  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.

V

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):

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&lt;Rectangle2D&gt; desenhados = new ArrayList&lt;Rectangle2D&gt;();

    /**
     * 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.
     * <p>
     * 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();
    }
}

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

A

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.
Criado 21 de outubro de 2008
Ultima resposta 24 de out. de 2008
Respostas 7
Participantes 2